国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

這篇具有很好參考價值的文章主要介紹了Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

我有一個People表,有三行數(shù)據(jù):
Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

如果我們沒詳細(xì)了解數(shù)據(jù)庫事務(wù)執(zhí)行加鎖的過程中,會不會有這樣一個疑問:如下的這段 SQL 開啟了事務(wù),并且在事務(wù)中進(jìn)行了更新和查詢操作。

BEGIN TRAN 
	update People set Name='張三' where id=1;
	
	select * from People where id=1;
commit tran

我們知道sql server數(shù)據(jù)庫的默認(rèn)事務(wù)級別是READ COMMITTED(已提交的讀取),我們再看一下已提交讀事務(wù)隔離級別描述:

允許事務(wù)讀取另一個事務(wù)以前讀?。ㄎ葱薷模┑臄?shù)據(jù),而不必等待第一個事務(wù)完成。 SQL Server數(shù)據(jù)庫引擎將保留 (對所選數(shù)據(jù)) 獲取的寫入鎖,直到事務(wù)結(jié)束,但讀取鎖將在執(zhí)行 SELECT 操作后立即釋放。 這是SQL Server數(shù)據(jù)庫引擎默認(rèn)級別。

那么我們在READ COMMITTED 隔離級別下更新People表數(shù)據(jù)庫,按照這個邏輯在id=1的數(shù)據(jù)行上添加排它鎖(X鎖)并等到事務(wù)提交后才會釋放鎖。
但是事務(wù)繼續(xù)執(zhí)行查詢,在READ COMMITTED隔離級別下 Select 會對查詢數(shù)據(jù)施加共享鎖(S鎖)。因?yàn)橛信潘i,所以查詢無法獲得共享鎖需要等待排它鎖釋放,如果按照這個邏輯的話這個事務(wù)自身就死鎖無法執(zhí)行了。

但這個事務(wù)還是會正常執(zhí)行完成,針對這個疑問,那么我們看下數(shù)據(jù)庫的事務(wù)和鎖:

數(shù)據(jù)庫引擎隔離級別

ISO 標(biāo)準(zhǔn)定義了以下隔離級別,SQL Server數(shù)據(jù)庫引擎支持所有這些隔離級別:

隔離級別 定義
未提交的讀取 隔離事務(wù)的最低級別,只能保證不讀取物理上損壞的數(shù)據(jù)。 在此級別上,允許臟讀,因此一個事務(wù)可能看見其他事務(wù)所做的尚未提交的更改。
已提交的讀取 允許事務(wù)讀取另一個事務(wù)以前讀?。ㄎ葱薷模┑臄?shù)據(jù),而不必等待第一個事務(wù)完成。 SQL Server數(shù)據(jù)庫引擎將保留 (對所選數(shù)據(jù)) 獲取的寫入鎖,直到事務(wù)結(jié)束,但讀取鎖將在執(zhí)行 SELECT 操作后立即釋放。 這是SQL Server數(shù)據(jù)庫引擎默認(rèn)級別。
可重復(fù)的讀取 SQL Server數(shù)據(jù)庫引擎會保留對所選數(shù)據(jù)獲取的讀取和寫入鎖定,直到事務(wù)結(jié)束。 但是,因?yàn)椴还芾矸秶i,可能發(fā)生虛擬讀取。
可序列化 隔離事務(wù)的最高級別,事務(wù)之間完全隔離。 SQL Server數(shù)據(jù)庫引擎保留對所選數(shù)據(jù)獲取的讀取和寫入鎖定,這些鎖將在事務(wù)結(jié)束時釋放。 SELECT 操作使用分范圍的 WHERE 子句時獲取范圍鎖,主要為了避免虛擬讀取。 注意: 請求可序列化隔離級別時,復(fù)制的表上的 DDL 操作和事務(wù)可能失敗。 這是因?yàn)閺?fù)制查詢使用的提示可能與可序列化隔離級別不兼容。

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!
SQL Server數(shù)據(jù)庫引擎使用不同的鎖模式鎖定資源,這些模式確定并發(fā)事務(wù)如何訪問資源。

T-SQL 設(shè)置事務(wù)隔離級別,只對當(dāng)前會話連接一直有效

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

鎖模式

下表顯示了SQL Server數(shù)據(jù)庫引擎使用的資源鎖模式。

鎖模式 說明
共享 (S) 用于不更改或不更新數(shù)據(jù)的讀取操作,如 SELECT 語句。
更新 (U) 用于可更新的資源中。 防止當(dāng)多個會話在讀取、鎖定以及隨后可能進(jìn)行的資源更新時發(fā)生常見形式的死鎖。
排他 (X) 用于數(shù)據(jù)修改操作,例如 INSERT、UPDATE 或 DELETE。 確保不會同時對同一資源進(jìn)行多重更新。
意向 用于建立鎖的層次結(jié)構(gòu)。 意向鎖包含三種類型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。
架構(gòu) 在執(zhí)行依賴于表架構(gòu)的操作時使用。 架構(gòu)鎖包含兩種類型:架構(gòu)修改 (Sch-M) 和架構(gòu)穩(wěn)定性 (Sch-S)。
大容量更新 (BU) 在將數(shù)據(jù)大容量復(fù)制到表中且指定了 TABLOCK 提示時使用。
鍵范圍 當(dāng)使用可序列化事務(wù)隔離級別時保護(hù)查詢讀取的行的范圍。 確保再次運(yùn)行查詢時其他事務(wù)無法插入符合可序列化事務(wù)的查詢的行。

鎖兼容性

鎖兼容性控制多個事務(wù)能否同時獲取同一資源上的鎖。 如果資源已被另一事務(wù)鎖定,則僅當(dāng)請求鎖的模式與現(xiàn)有鎖的模式相兼容時,才會授予新的鎖請求。 如果請求鎖的模式與現(xiàn)有鎖的模式不兼容,則請求新鎖的事務(wù)將等待釋放現(xiàn)有鎖或等待鎖超時間隔過期。 例如,沒有與排他鎖兼容的鎖模式。 如果具有排他鎖(X 鎖),則在釋放排他鎖(X 鎖)之前,其他事務(wù)均無法獲取該資源的任何類型(共享、更新或排他)的鎖。 另一種情況是,如果共享鎖(S 鎖)已應(yīng)用到資源,則即使第一個事務(wù)尚未完成,其他事務(wù)也可以獲取該項(xiàng)的共享鎖或更新鎖(U 鎖)。 但是,在釋放共享鎖之前,其他事務(wù)無法獲取排他鎖。

下表顯示了最常見的鎖模式的兼容性。
Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

查看執(zhí)行時鎖的情況

通過鎖的兼容性模式我們知道在id=1的行上添加了排它鎖,那么它就無法再接收任何鎖,那我們調(diào)試這個事務(wù)看看鎖的情況。
Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

我們調(diào)試到第3行,這個時候看下鎖的情況,此時事務(wù)添加了key(行)排它鎖X鎖,page(頁)和object(表)添加了意向排它鎖IX鎖。

SELECT 
resource_type,
resource_database_id,
resource_description,
request_mode,
request_type,
request_session_id,
request_owner_type,
request_owner_id,
lock_owner_address
FROM sys.dm_tran_locks where request_owner_type='transaction'

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

然后我們再繼續(xù)調(diào)試到第4行,此時還沒提交事務(wù),排它鎖X依然存在,但是沒有S鎖。

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

我們知道在讀提交事務(wù)隔離級別下,S鎖是使用完了就釋放的,所以我們用SQL Server Profiler來監(jiān)視下鎖的情況,設(shè)置監(jiān)控的項(xiàng)為lock,然后設(shè)置篩選條件。

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!
Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

上面我已經(jīng)將 張三1 改為了 張三,我們再將 張三 改回 張三1,并啟動監(jiān)控。

BEGIN TRAN 
	update People set Name='張三1' where id=1;
	select * from People where id=1;
commit tran

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

可以看到事務(wù) transactionid=30010685 的鎖監(jiān)控 :

  • 首先申請IX更新意向鎖(object,page) 準(zhǔn)備更新,然后獲得行上的X排它鎖進(jìn)行更新,更新后釋放了行鎖和page鎖(EventClass= Lock:released,Mode=0-null)。
  • 等查詢時申請page頁IS意向讀取鎖,并獲得行S鎖讀取數(shù)據(jù)后釋放行鎖和page頁鎖。
  • 最后還有幾個順序釋放,依次是key、page、Object,這里恰好和上面調(diào)試還沒提交事務(wù)時查詢sys.dm_tran_locks的鎖情況一樣,也就是說事務(wù)提交后依次又進(jìn)行了一遍釋放。

通過上面我們得出結(jié)論,事務(wù)里面并不是取得了X鎖要等事務(wù)結(jié)束后才釋放,在事務(wù)執(zhí)行過程中也是有釋放的,只是事務(wù)還保持著對于鎖在事務(wù)層面的記錄,防止其它事務(wù)并發(fā)(這里是我推斷的,沒找到相關(guān)文獻(xiàn)說明)。
所以事務(wù)是在鎖上更宏觀的邏輯隔離,事務(wù)隔離級別只是在業(yè)務(wù)上保證數(shù)據(jù)符合隔離級別預(yù)期,至于事務(wù)中如何控制鎖是基于數(shù)據(jù)庫內(nèi)在設(shè)計,而不能通過事務(wù)的描述去推斷鎖過程。

我查閱網(wǎng)上很多博文和官方資料都是講事務(wù)和鎖概念,有時候結(jié)合兩種也是模棱兩可看不出什么強(qiáng)聯(lián)系,沒有講事務(wù)執(zhí)行過程中鎖是如何變化的,不知道我這篇推論是否正確,歡迎指正。

再次驗(yàn)證

我將事務(wù)隔離級別設(shè)置為REPEATABLE READ(可重復(fù)讀),然后調(diào)試到commit行還沒提交,我們看跟蹤的鎖和事務(wù)鎖表dm_tran_locks查詢的結(jié)果,按照REPEATABLE READ描述,select查詢的S鎖會在事務(wù)提交后釋放,我們看看截圖情況

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

開啟了SQL Server Profiler結(jié)果,查詢id=3后S鎖已經(jīng)釋放。

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

再查dm_tran_locks表,表中依然顯示事務(wù)獲取了S鎖,并且 resource_description=98ec012aa510 資源描述和上面跟蹤是對應(yīng)的。
Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!

最后我們執(zhí)行完調(diào)試,跟蹤鎖顯示又按照順序釋放了一遍鎖

Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!文章來源地址http://www.zghlxwxcb.cn/news/detail-427938.html

到了這里,關(guān)于Sql Server 數(shù)據(jù)庫事務(wù)與鎖,同一事務(wù)更新又查詢鎖的變化,期望大家來解惑!的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SQL Server數(shù)據(jù)庫使用SQL Server代理實(shí)現(xiàn)數(shù)據(jù)庫自動備份

    SQL Server數(shù)據(jù)庫使用SQL Server代理實(shí)現(xiàn)數(shù)據(jù)庫自動備份

    在現(xiàn)實(shí)中,為了保證數(shù)據(jù)的安全和完整,防止人為錯誤和硬件故障等造成的數(shù)據(jù)丟失和損壞,就需要用到數(shù)據(jù)庫的備份,不同的數(shù)據(jù)庫方法有所差別,我這邊主講SQL Server數(shù)據(jù)庫的備份和使用SQL Server代理作業(yè)實(shí)現(xiàn)數(shù)據(jù)庫的定時備份。 目錄 一、開啟SQL Server代理 1、找到SQL Serv

    2024年02月09日
    瀏覽(107)
  • 【建議收藏】數(shù)據(jù)庫 SQL 入門——事務(wù)(內(nèi)附演示)

    【建議收藏】數(shù)據(jù)庫 SQL 入門——事務(wù)(內(nèi)附演示)

    ???♂?作者簡介:生魚同學(xué),大數(shù)據(jù)科學(xué)與技術(shù)專業(yè)碩士在讀?????,曾獲得華為杯數(shù)學(xué)建模國家二等獎??,MathorCup 數(shù)學(xué)建模競賽國家二等獎??,亞太數(shù)學(xué)建模國家二等獎??。 ??研究方向:復(fù)雜網(wǎng)絡(luò)科學(xué) ??興趣方向:利用python進(jìn)行數(shù)據(jù)分析與機(jī)器學(xué)習(xí),數(shù)學(xué)建模競

    2023年04月23日
    瀏覽(25)
  • SQL Server數(shù)據(jù)庫——創(chuàng)建數(shù)據(jù)庫

    SQL Server數(shù)據(jù)庫——創(chuàng)建數(shù)據(jù)庫

    目錄 一、界面方式創(chuàng)建數(shù)據(jù)庫 1.1創(chuàng)建數(shù)據(jù)庫xscj,數(shù)據(jù)文件和日志文件的屬性按默認(rèn)值設(shè)置 ?1.2在xscj數(shù)據(jù)庫中增加文件xcsj1,其屬性均取系統(tǒng)默認(rèn)值 ?1.3在數(shù)據(jù)庫xscj中增加一個名為myGroup的文件組。 1.4數(shù)據(jù)庫的重命名? 1.5數(shù)據(jù)庫的刪除? 二、命令方式創(chuàng)建數(shù)據(jù)庫 以創(chuàng)建學(xué)生管

    2024年02月01日
    瀏覽(31)
  • SQL Server 數(shù)據(jù)庫安裝教程SQL Server 2017

    SQL Server 數(shù)據(jù)庫安裝教程SQL Server 2017

    官網(wǎng):?SQL Server 下載 | Microsoft ?軟件版本看你自己需求啦,反正我是下了SQL Server 2017 評估版(試用180天,秘鑰自己百度) ?下載后,軟件有點(diǎn)小,不是實(shí)際的安裝包,只是安裝導(dǎo)向包,在安裝過程才下載實(shí)際的安裝包: ? ? ?要保持有網(wǎng)絡(luò),直接雙擊安裝,選基本即可: ?選好

    2024年02月05日
    瀏覽(111)
  • sql server數(shù)據(jù)庫跟蹤——SQL Server Profiler解析

    sql server數(shù)據(jù)庫跟蹤——SQL Server Profiler解析

    工具 : SQL Server Profiler這個工具是SQL Server數(shù)據(jù)庫自帶的語句執(zhí)行跟蹤工具,常使用于分析軟件修改數(shù)據(jù)庫時所執(zhí)行的語句,適合用來研究軟件運(yùn)行數(shù)據(jù)庫的原理。 打開方式: 本機(jī)安裝了SQL server的話,都是自帶的。直接去直接在【開始】-【程序】-搜索Profiler可找到【SQL Ser

    2024年04月16日
    瀏覽(103)
  • SQL Server2008數(shù)據(jù)庫升級至SQL Server2012

    SQL Server2008數(shù)據(jù)庫升級至SQL Server2012

    今天接到了一個需求,服務(wù)器上的數(shù)據(jù)庫需要從SQL Server2008升級到2012。根據(jù)之前的經(jīng)驗(yàn),感覺是一個非常有意思的過程(事實(shí)上也是。這個過程也給了我一些觸動與啟發(fā),因此,便記錄了自己的踩坑過程以及解決方案,還有安裝過程的體會。 啟動SQL Server2012的安裝引導(dǎo)程序,

    2024年02月05日
    瀏覽(93)
  • 數(shù)據(jù)庫實(shí)驗(yàn):SQL的數(shù)據(jù)更新

    數(shù)據(jù)庫實(shí)驗(yàn):SQL的數(shù)據(jù)更新

    再次書接上文,sql基礎(chǔ)的增刪改查 (1) 掌握DBMS的數(shù)據(jù)查詢功能 (2) 掌握SQL語言的數(shù)據(jù)更新功能 (1) update 語句用于對表進(jìn)行更新 (2) delete 語句用于對表進(jìn)行刪除 (3) insert 語句用于對表進(jìn)行插入 (1) 熟練掌握SQL的數(shù)據(jù)更新語句INSERT、UPDATE、DELETE (2) 寫出實(shí)驗(yàn)報告 認(rèn)真閱讀S_T.sql,理

    2024年02月05日
    瀏覽(22)
  • SQL Server數(shù)據(jù)庫管理

    SQL Server數(shù)據(jù)庫管理

    數(shù)據(jù)庫登錄——使用兩種方式均可登錄數(shù)據(jù)庫:windows和sqlserver身份驗(yàn)證方式兩種。 ?數(shù)據(jù)庫的使用和管理 步驟一:創(chuàng)建數(shù)據(jù)庫 1)新建數(shù)據(jù)庫,數(shù)據(jù)庫名為book,初始大小都配置為3,自動增長與路徑都為默認(rèn),點(diǎn)擊確定 ? 步驟二:查看主數(shù)據(jù)與日志文件(查看C:Program Files

    2024年02月13日
    瀏覽(34)
  • Sql server數(shù)據(jù)庫安裝

    Sql server數(shù)據(jù)庫安裝

    以sql server2014數(shù)據(jù)庫為例 sql server數(shù)據(jù)庫安裝需要注意兩點(diǎn): 1.不使用從鏡像中拷貝出的壓縮包安裝會報錯,提示缺少trin_aide.cab和vs_shell.cab文件 2.sql server2014數(shù)據(jù)庫安裝前需要安裝.net Framework 3.5 各個版本sql server數(shù)據(jù)庫情況: 1.sql server2008 R2數(shù)據(jù)庫提示需要.net Framework 3.5。但不

    2024年02月09日
    瀏覽(28)
  • SQL Server數(shù)據(jù)庫使用

    SQL Server數(shù)據(jù)庫使用

    SQL Server 2008 R2的安裝和使用 安裝前的準(zhǔn)備 安裝過程 1)安裝所選功能 2)安裝的類型:默認(rèn)或命名實(shí)例 3)服務(wù)賬戶 4)身份驗(yàn)證模式 5)排序規(guī)則設(shè)置 6)開始安裝 7)完成安裝 驗(yàn)證數(shù)據(jù)庫安裝成功 【開始】|【程序】中可以看到Microsoft SQL Server 2008的程序組 啟動和停止數(shù)據(jù)庫

    2024年02月11日
    瀏覽(98)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包