不可重複度和幻讀區別:不可重複讀的重點是修改,幻讀的重點在於新增或者刪除。
sql 標準定義了四個隔離級別:
隔離級別
髒讀
不可重複讀
幻影讀
read-uncommitted
read-committed
repeatable-read
serializable
mysql innodb 儲存引擎的預設支援的隔離級別是repeatable-read(可重讀)。我們可以通過select @@tx_isolation;命令來檢視,mysql 8.0 該命令改為select @@transaction_isolation;
這裡需要注意的是:與 sql 標準不同的地方在於innodb 儲存引擎在repeatable-read(可重讀)事務隔離級別下,允許應用使用 next-key lock 鎖演算法來避免幻讀的產生。這與其他資料庫系統(如 sql server)是不同的。所以說雖然 innodb 儲存引擎的預設支援的隔離級別是repeatable-read(可重讀),但是可以通過應用加鎖讀(例如 select * from table for update 語句)來保證不會產生幻讀,而這個加鎖度使用到的機制就是 next-key lock 鎖演算法。從而達到了 sql 標準的serializable(可序列化)隔離級別。
不同時刻啟動的事務會有不同的 read-view。如圖中看到的,在檢視 a、b、c 裡面,這乙個記錄的值分別是 1、2、4,同一條記錄在系統中可以存在多個版本,就是資料庫的多版本併發控制(mvcc)。對於 read-view a,要得到 1,就必須將當前值依次執行圖中所有的回滾操作得到。
當系統裡沒有比這個回滾日誌更早的 read-view 的時候,刪除對應回滾日誌。
由此,我們引入長事物的概念。長事務意味著系統裡面會存在很老的事務檢視。由於這些事務隨時可能訪問資料庫裡面的任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就會導致大量占用儲存空間。
除了對回滾段的影響,長事務還占用鎖資源,也可能拖垮整個庫。
mysql 的事務啟動方式有以下幾種:
顯式啟動事務語句, begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback。
set autocommit=0,這個命令會將這個執行緒的自動提交關掉。意味著如果你只執行乙個 select 語句,這個事務就啟動了,而且並不會自動提交。這個事務持續存在直到你主動執行 commit 或 rollback 語句,或者斷開連線。
有些客戶端連線框架會預設連線成功後先執行乙個 set autocommit=0 的命令。這就導致接下來的查詢都在事務中,如果是長連線,就導致了意外的長事務。
第一種方式為了減少了語句的互動次數,可以使用 commit work and chain 語法。在 autocommit 為 1 的情況下,用 begin 顯式啟動的事務,如果執行 commit 則提交事務。如果執行 commit work and chain,則是提交事務並自動啟動下乙個事務,這樣也省去了再次執行 begin 語句的開銷。同時帶來的好處是從程式開發的角度明確地知道每個語句是否處於事務中。
可以在 information_schema 庫的 innodb_trx 這個表中查詢長事務,比如下面這個語句,用於查詢持續時間超過 60s 的事務。
select * from information_schema.innodb_trx where time_to_sec(timediff(now(),trx_started))>60
事物之隔離性詳解
概念 事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的失去,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。多個執行緒開啟各自事務運算元據庫中資料時,資料庫系統要負責隔離操作,以保證各個執行緒在獲取資料時的準確性。如果不考慮隔離性,可能會引發如下問題 1 髒讀 是指乙...
事物隔離的3種預防
1.isolation default 一般情況下使用這種配置既可 這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別。2.isolation read uncommitted 這是事務最低的隔離級別,它充許別外乙個事務可以看到這個事務未提交的資...
事物隔離的3種預防
1.isolation default 一般情況下使用這種配置既可 這是乙個platfromtransactionmanager預設的隔離級別,使用資料庫預設的事務隔離級別。2.isolation read uncommitted 這是事務最低的隔離級別,它充許別外乙個事務可以看到這個事務未提交的資...