Sqlerver 鎖和隔離級別

2021-10-12 18:23:09 字數 1935 閱讀 2113

概念:

共享 (s):用於不更改或不更新資料的操作(唯讀操作),如 select 語句。

更新 (u):用於可更新的資源中。防止當多個會話在讀取、鎖定以及隨後可能進行的資源更新時發生常見形式的死鎖。

排它 (x):用於資料修改操作,例如 insert、update 或 delete。確保不會同時同一資源進行多重更新。

增刪改查使用:

select語句缺省會產生共享鎖,該鎖查詢完就釋放,不需要等待所在的事務提交。

update語句先使用更新鎖鎖定資料,然後公升級成獨佔鎖。

insert,update語句使用獨佔鎖。

關於update鎖:

這裡這種介紹一下,為什麼需要更新鎖?

首先updtae語句,對於符合條件的資料新增u鎖(注意u鎖和x鎖不相容),

真正更新資料時,把u鎖公升級成x鎖,即update過程,是u鎖公升級x鎖,修改資料

例如,update table1 set type=『1』 where type=『b』

實際過程是首先對掃瞄的資料新增u鎖,對於不符合條件的,釋放u鎖;對於符合條件的,把u鎖公升級成x鎖,修改資料。

由於u所的互斥性,不可能對同一資料新增兩個u鎖。

若是沒有u鎖,則變成update過程,是s鎖公升級x鎖,修改資料, 那麼的話,在執行update時,有可能兩個事務同時用s鎖,鎖住了同乙個資料;

然後雙方都是從s鎖公升級成x鎖,都在等待對方釋放s鎖,這樣就產生了死鎖。

u鎖的引入,可以有效的解決此類問題。

隔離級別:

未提交讀: 讀取到未提交的資料 。

已提交讀:

悲觀模式(is_read_committed_snapshot_on=0,預設設定),傳統的已提交讀,只能讀取到已經提交的資料。讀寫會產生衝突。

樂觀模式(is_read_committed_snapshot_on=1),加入行版本控制,只能讀取到已提交的資料,讀寫不會產生衝突,併發性更好,生產環境需要測試。

可重複讀: 乙個事務中,多次讀取相同的一條或者幾條資料,看到的結果是一樣的。

可序列化: 這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問。題。簡言之,它是在每個讀的資料行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

快照隔離:啟用 snapshot(快照) 隔離級別時,每次更新行時,sql server 資料庫引擎在 tempdb中儲存原始行的副本,並為該行新增事務序列號。

快照和mvcc:

目前多數關聯式資料庫採用2pl協議保證了併發事務執行的可序列化,這樣就產生了讀寫互斥的問題,即s鎖和x鎖的互斥。

多版本併發控制(multi-version concurrency control,mvcc)較好地解決了這一問題。在多版本的系統中,每一次寫資料均產生乙個新的版本,讀操作可以根據需要讀取合適的版本,因此讀寫操作互不阻塞。mvcc雖然提高了併發度,但也帶來了維護多個版本的儲存開銷。

microsoft sql server 資料庫引擎引入了現有事務隔離級別的一種新的實現方式 - 已提交讀,用於提供使用行版本控制的語句級快照。sql server 資料庫引擎還引入了乙個新的事務隔離級別 - 快照,用於提供也使用行版本控制的事務級快照。

版本儲存區是 tempdb 中的資料頁集合。如果有多個事務修改行,則該行的多個版本將被鏈結到乙個版本鏈中。使用行版本控制的讀操作將檢索每一行在事務或語句啟動時已提交的最後乙個版本。

Oracle 事務隔離級別和鎖

1.事務的特性 acid 1 原子性 atomicity 事務所包含的資料庫操作要麼都做,要麼都不做 2 一致性 consistency 事務前後,所有的資料都保持一致的狀態 例如 事務之前a,b兩個賬戶的總和是10萬 a 4w,b 6w 現在a轉賬2w給b a 2w,b 8w a,b賬戶總和依舊是...

SQLserver鎖和事務隔離級別

隔離級別 隔離級別 髒讀不可重複讀 幻象說明 未提交讀 read uncommitted 是是 是如果其他事務更新,不管是否提交,立即執行 提交讀 read committed預設 否是 是讀取提交過的資料。如果其他事務更新沒提交,則等待 可重複讀 repeatable read 否否 是查詢期間,...

Mysql 鎖 隔離級別

1.共享鎖 只要有乙個人 事務或執行緒 在查詢,其他人就都不能改,要照顧少數 下面是將所有性別是男的資料都加上共享鎖 select from table where 男 lock in share mode2.排他鎖 只要有乙個人 事務或執行緒 在用 增刪改差 其他人就不能用 下面是將所有性別是男的...