Sqlserver事務和鎖🔒
事務:事務是包含一組數據庫操作的邏輯工作單元,用於保證數據的一致性和可恢復性。
事務的分類:
1.自動提交事務:在sqlserver中,每條sql語句都被看作是一個事務,當執行完成後,數據庫引擎都會自動執行提交事務或回滾事務。
2.顯示事務:使用begin transaction語句標識事務的開始,使用commit或rollback語句標識事務的結束。
3.隱式事務
4.批處理級事務
事務保存點 save transaction 語句
保存點定義了事務中的一個位置,可以在rollback的時候講數據回滾到保存點的位置,從而實現部分回滾事務的功能,避免不必要的系統資源損耗。
例:
begin transaction test save transaction a insert into shop values(‘111‘); rollback transaction a insert into shop values(‘222‘); commit transaction test
嵌套事務
sqlserver支持嵌套事務
事務的隔離級別
read uncommitted:指定語句可以讀取已由其他事物修改但尚未提交的行,在這種事務隔離級別下,語句可以讀取到未提交的修改,這種讀取叫做臟讀,是限制最少的級別。
read committed
repeatable read:指定語句不能讀取其他事物正在修改但尚未提交的行,而且其他事物也不能修改當前事務在提交前所讀取的數據。
snapshot:指定事務在開始時,就獲得了已經提交數據的快照,因此當前事務只能看到在事務開始之前對數據所做的修改。
serializable:提供最高級別的事務隔離。當事務處在這個級別時,一個查詢只能看到事務開始之前提交的數據,而無法看到臟數據或事務執行中其他並行事務所修改的數據。在此級別下,事務就好像被一個一個地串行執行,而不是並發執行多個事務。
settransaction isolation level { read uncommitted | read committed | repeatable read | snapshot | serializable }
鎖的分類
按系統角度分為:共享鎖、獨占鎖(排他鎖)、更新鎖、意向鎖、架構鎖、大容量更新鎖。
從並發控制手段上分為:樂觀鎖、悲觀鎖。
https://www.cnblogs.com/rasion/archive/2010/03/29/1699600.html
鎖的兼容性
鎖的粒度和結構層次
數據庫引擎具有多粒度鎖定,允許一個事務鎖定不同類型的資源。鎖定在較小的粒度(例如行)可以提高並發度,但開銷大,因為鎖定的範圍越小,需要的鎖就越多(鎖定了許多行,就需要持有更多的鎖);鎖定在較大的粒度(例如表)會降低並發度,但是消耗較低, 因為鎖定的範圍大,需要的鎖就越小(鎖定了表,限制了其他事物對表的訪問)。
數據庫引擎通常必須獲取多粒度級別上的鎖才能完整地保護資源。這種多粒度級別上的鎖稱為鎖層次結構
查看鎖的活動情況
1.使用sqlserver時間探查器
2.使用windows管理工具->性能 ,系統監視器
3.系統視圖:sys.dm_tran_locks
死鎖產生的原因以及如何避免
https://www.cnblogs.com/wangweitr/p/7158023.html
參考:《sqlserver性能監測與優化》
Sqlserver事務和鎖🔒