鎖定和行版本控制

2022-02-20 15:46:31 字數 1301 閱讀 3283

當多個使用者同時訪問資料時,sql server 資料庫引擎使用以下機制確保事務的完整性和保持資料庫的一致性:

每個事務對所依賴的資源(如行、頁或表)請求不同型別的鎖。鎖可以阻止其他事務以某種可能會導致事務請求鎖出錯的方式修改資源。當事務不再依賴鎖定的資源時,它將釋放鎖。

當啟用了基於行版本控制的隔離級別時,資料庫引擎將維護修改的每一行的版本。應用程式可以指定事務使用行版本檢視事務或查詢開始時存在的資料,而不是使用鎖保護所有讀取。通過使用行版本控制,讀取操作阻止其他事務的可能性將大大降低。

鎖定和行版本控制可以防止使用者讀取未提交的資料,還可以防止多個使用者嘗試同時更改同一資料。如果不進行鎖定或行版本控制,對資料執行的查詢可能會返回資料庫中尚未提交的資料,從而產生意外的結果。

應用程式可以選擇事務隔離級別,為事務定義保護級別,以防被其他事務所修改。可以為各個 transact-sql 語句指定表級別的提示,進一步定製行為以滿足應用程式的要求。

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

將 read_committed_snapshot 資料庫選項設定為 on 可啟用使用行版本控制的已提交讀隔離。將 allow_snapshot_isolation 資料庫選項設定為 on 可啟用快照隔離。為資料庫啟用任一選項時,資料庫引擎都將保持被修改的每一行的版本。每當某個事務修改行時,修改前的該行影象將被複製到版本儲存區的一頁中。版本儲存區是tempdb中的資料頁集合。如果有多個事務修改行,則該行的多個版本將被鏈結到乙個版本鏈中。使用行版本控制的讀操作將檢索每一行在事務或語句啟動時已提交的最後乙個版本。

為 sql server 2000 編寫的或 sql server 中新增的應用程式,通過在 read_committed_snapshot 資料庫選項為 on 時指定讀提交的事務隔離級別,來實現使用行版本控制的讀提交的隔離。所有讀操作都將檢視語句啟動時已提交的行版本。這將提供資料的語句級快照。

為 sql server 編寫的應用程式將通過在 allow_snapshot_isolation 資料庫選項為 on 時指定快照事務隔離級別,來實現快照隔離。快照事務中的所有讀操作都將檢視事務啟動時已提交的行版本。這將提供資料的事務級快照。

對於使用基於行版本控制的隔離級別的事務,讀操作不對資料請求共享鎖。這意味著使用行版本控制的讀取器不會妨礙其他讀取器或編寫器訪問同一資料。同理,編寫器也不會妨礙讀取器。但是,編寫器會互相妨礙(即使是在基於行版本控制的隔離級別下執行)。兩個寫操作不能同時修改同一資料。

mysql 行級鎖定 MySQL中的行級鎖定

鎖是在執行多執行緒時用於強行限定資源訪問的同步機制,資料庫鎖根據鎖的粒度可分為行級鎖,表級鎖和頁級鎖 行級鎖行級鎖是mysql中粒度最細的一種鎖機制,表示只對當前所操作的行進行加鎖,行級鎖發生衝突的概率很低,其粒度最小,但是加鎖的代價最大。行級鎖分為共享鎖和排他鎖。特點 開銷大,加鎖慢,會出現死鎖 ...

Mysql解鎖行鎖定

1.查詢 正在執行的事務 select from information schema.innodb trx 2.殺死程序id 就是上面查詢結果集的trx mysql thread id列 kill 執行緒id 這樣行鎖鎖定就解決了 查詢mysql資料庫中還可以使用 檢視正在鎖的事務 select ...

事務控制和鎖定語句

myisam 和memory 儲存引擎的表 表級鎖定 bdb儲存引擎的表 頁級鎖定 innodb 的儲存引擎的表 行級鎖定 預設情況下,表鎖和行鎖是自動獲取,不需要額外的命令。但有的情況下,使用者需要明確地進行鎖表或進行事務控制,以便確保整個事務的完整性,因而需要事務控制和鎖定語句。1 lock t...