標籤:sha date inno 操作 層級 let 商務邏輯 開始 表鎖
什麼是事務(transaction)
保證成批操作要麼完全執行,要麼完全不執行,維護資料的完整性。也就是要麼成功要麼失敗。
事務可以是n條sql語句(n>=0)
不是所有資料庫引擎支援事務,InnoDB引擎支援交易處理
事務四大特性
原子性(Atomic):事務的所有所有操作要麼全部執行,要麼全部不執行。如果中途出現錯誤不會停止,而是復原到事務前的狀態
一致性(Consistency):如果事務執行前是一致的,那麼執行後也是一致的,不能破壞關係資料的完整性以及商務邏輯上的一致性,事務按照預期實現。
隔離性(Isolation):隔離性可以防止多個事務並發時導致資料的不一致
持久性(Durability):事務執行成功後對資料庫的修改是永久的
事務並發不進行事務隔離
髒讀:事務A讀到未提交事務B修改的資料,如果此時事務B中途執行失敗復原,那麼此時事務A讀取到的就是髒資料。比如事務A對money進行修改,此時事務B讀取到事務A的更新結果,但是如果後面事務A復原,那麼事務B讀取到的就是髒資料了。
不可重複讀取:同一個事務中,對同一份資料讀取的結果不一致。事務A在事務B對資料更新前進行讀取,然後事務B更新提交,事務A再次讀取,這時候兩次讀取的資料不同。
幻讀:同一個事務中,同一個查詢多次返回的結果不一樣。事務B查詢表的記錄數,然後事務A對錶插入一條記錄,接著事務B重新查詢發現記錄數不同。
區別
髒讀和不可重複讀取:髒讀是事務讀取了還未提交事務的更新資料。不可重複讀取是同一個事務中,幾次讀取的資料不同。
不可重複讀取和幻讀的區別:都是在同一個事務中,前者是幾次讀取資料不同,後者是幾次讀取資料整體不同。
隔離等級
| 隔離等級 |
作用 |
| Serializable(序列化) |
避免髒讀、不可重複讀取、幻讀 |
| Repeatable(可重複讀) |
避免髒讀、不可重複讀取 |
| Read committed(讀已提交) |
避免髒讀 |
| Read uncommitted(讀未提交) |
none |
mysql支援上面4種隔離等級,預設為可重複讀
事務的使用
start transcation; transcation 事務開始delete from user; rollback 復原到事務起點savepoint dele; savepoint 保留復原位置****rollback dele; rollback point_name 復原到設定的位置commit;
使用注意點
如果事務中sql正確運行,後面沒有commit,結果是不會更新到資料庫的,所以需要手動添加commit。
如果事務中部分sql語句出現錯誤,那麼錯誤語句後面不會執行。而我們可能會認為正確操作會復原撤銷,但是實際上並沒有撤銷正確的操作,此時如果再無錯情況下進行一次commit,之前的正確操作會生效,資料庫會進行更新。
InnoDB引擎的鎖機制
(之所以以InnoDB為主介紹鎖,是因為InnoDB支援事務,支援行鎖和表鎖用的比較多,Myisam不支援事務,只支援表鎖)
共用鎖定(S):允許一個事務去讀一行,阻止其他事務獲得相同資料集的獨佔鎖定。
獨佔鎖定(X):允許獲得獨佔鎖定的事務更新資料,阻止其他事務取得相同資料集的共用讀鎖和排他寫鎖。
意圖共用鎖(IS):事務打算給資料行加行共用鎖定,事務在給一個資料行加共用鎖定前必須先取得該表的IS鎖。
意向獨佔鎖定(IX):事務打算給資料行加行獨佔鎖定,事務在給一個資料行加獨佔鎖定前必須先取得該表的IX鎖。
說明:
1)共用鎖定和獨佔鎖定都是行鎖,意圖鎖定都是表鎖,應用中我們只會使用到共用鎖定和獨佔鎖定,意圖鎖定是mysql內部使用的,不需要使用者幹預。
2)對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及資料集加獨佔鎖定(X);對於普通SELECT語句,InnoDB不會加任何鎖,事務可以通過以下語句顯示給記錄集加共用鎖定或獨佔鎖定。
共用鎖定(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。
獨佔鎖定(X):SELECT * FROM table_name WHERE ... FOR UPDATE。
3)InnoDB行鎖是通過給索引上的索引項目加鎖來實現的,因此InnoDB這種行鎖實現特點意味著:只有通過索引條件檢索資料,InnoDB才使用行級鎖,否則,InnoDB將使用表鎖!。
來源:www.cnblogs.com/-new/p/7239456.html
來源:www.cnblogs.com/fidelQuan/p/4549068.html
Mysql事務,並發問題,鎖機制