MySQL/Transaction
< MySQL
Innodb開始支持事務。默認是自動提交,除非顯式地開始一個事務,否則每個查詢都被當做一個單獨的事務自動執行。
set autocommit=0 設置事務非自動提交。自此句執行以後,每個SQL語句或者語句塊所在的事務都需要顯示"commit"才能提交事務。
通過以下命令可以查看當前autocommit模式
show variables like 'autocommit'; select @@autocommit;
注意事項:
- 不管autocommit 是1還是0 ,START TRANSACTION 後,只有執行了commit數據才會生效,ROLLBACK就會回滾。
- 當autocommit 為 0 時,不管有沒有START TRANSACTION,只有執行了commit數據才會生效,ROLLBACK後就會回滾。關閉了資料庫連接並不會自動提交。
- 當autocommit 為1是 ,且沒有START TRANSACTION,則調用ROLLBACK是沒有用的,即便設置了SAVEPOINT。
- 髒讀:一個事務讀取到了另一個事務未提交的數據,這是特別危險的,要盡力防止。
- 不可重複讀:在一個事務內讀取表中的某一行數據,多次讀取結果不同。(一個事務讀取到了另一個事務已經提交的數據:增加記錄、刪除記錄、修改記錄),在某寫情況下並不是問題,在另一些情況下就是問題。
- 虛讀:是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。(一個事務讀取到了另一個事務已經提交的數據---增加記錄、刪除記錄),在某寫情況下並不是問題,在另一些情況下就是問題。
四個隔離級別:
- Serializable:可避免髒讀、不可重複讀、虛讀情況的發生。(串行化)
- Repeatable read:可避免髒讀、不可重複讀情況的發生。(可重複讀)不可以避免虛讀
- Read committed:可避免髒讀情況發生(讀已提交)
- Read uncommitted:最低級別,以上情況均無法保證。(讀未提交)
- 安全性考慮:Serializable>Repeatable read>Read committed>Read uncommitted
- 資料庫效率:Read uncommitted>Read committed>Repeatable read>Serializable
一般情況下,我們會使用Repeatable read、Read committed
mysql資料庫默認的資料庫隔離級別Repeatable read
mysql中設置資料庫的隔離級別語句:
set [global/session] transaction isolation level xxxx;
mysql中設置資料庫的隔離級別語句:
select @@tx_isolation;