事務併發導致的問題是資料庫需要重點解決的問題,關於事務處理的技術都已經非常成熟了,四種隔離級別再加上乙個快照是所有資料庫
mysql> commit
query ok, 0 rows affected (0.04 sec)
mysql> select * from innodb where;
| name | age |
| fzj | 25 |
1 row in set (0.00 sec)
即便是a事務提交了,b事務查詢的結果仍然不受干擾,這是可重複讀隔離級別的典型特性。可是如果 b事務也要更新同一條記錄怎麼辦?基於這個數字會導致a事務更新的丟失。
mysql> update innodb set age=age+5 where;
query ok, 1 row affected (0.00 sec)
rows matched: 1 changed: 1 warnings: 0
mysql> select * from innodb where;
| name | age |
| fzj | 35 |
1 row in set (0.00 sec)
可見a事務的更新並沒有丟失。如果在a事務未提交之前,b事務更新同一條記錄會導致b事務被阻塞,update需要對相應行加上行鎖,這種排他 鎖是獨占性的。
2>解決幻讀問題
mysql> start transaction;
query ok, 0 rows affected (0.00 sec)
mysql> insert into innodb values('ecy', 25);
query ok, 1 row affected (0.00 sec)
mysql> start transaction;
query ok, 0 rows affected (0.04 sec)
mysql> select count(*) from innodb;
| count(*) |
| 1 |
1 row in set (0.02 sec)
mysql> commit
query ok, 0 rows affected (0.05 sec)
mysql> select count(*) from innodb;
| count(*) |
| 1 |
1 row in set (0.00 sec)
可見a事務成功地插入了一條記錄,因為 它沒有同b事務競爭鎖,所以a事務插入記錄和b事務更新記錄可以同時進行,可是a事務提交之後並沒有導致b事務幻讀,mysql的可重複讀隔離級別確實能 避免幻讀。
3>serializable隔離級別
serializable隔離級別是最高的隔離級別,乙個事務中的查詢語句會給相應的行加上排他鎖,直到事務結束。
mysql> set session transaction isolation level serializable;
query ok, 0 rows affected (0.00 sec)
mysql> start transaction;
query ok, 0 rows affected (0.00 sec)
mysql> update innodb set age=age+6 where;
query ok, 1 row affected (0.00 sec)
rows matched: 1 changed: 1 warnings: 0
mysql> set session transaction isolation level serializable;
query ok, 0 rows affected (0.00 sec)
mysql> start transaction;
query ok, 0 rows affected (0.00 sec)
mysql> select * from innodb where;
b事務此時會被阻塞,因為a事務要跟新'fzj'這一行,因此給這行加上了排它鎖,b事務再將給 其加上共享鎖將會失敗。使用a事務commit之後,b事務才會往下執行(我發現讓我吃驚的行為,在b事務中即使查詢name='ecy'這行,b事務也 會被阻塞,難道使用了表鎖定??)。比較repeatable-read隔離級別可以發現,在可重複讀隔離級別不會給查詢語句加上共享鎖,,如果需要的話可 以顯示地使用select ... lock in share mode和select ... for update分別加上共享鎖和排他鎖。
mysql強隔離公升級 MySQL 隔離級別
一 事務特性 1.原子性 事務是乙個原子操作單元,事務中包含的所有操作要麼都做,要麼都不做,沒有第三種情況。2.一致性 事務操作前和操作後都必須滿足業務規則約束,比如說a向b轉賬,轉賬前和轉賬後ab兩個賬戶的總金額必須是一致的。3.隔離性 隔離性是資料庫允許多個併發事務同時對資料進行讀寫的能力,隔離...
mysql隔離級別 MySQL 事務隔離級別
mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...
mysql隔離級別驗證 mysql 隔離級別測試
1 設定隔離級別,包括 全域性 global.tx isolation,會話級別 session.tx isolation mysql workbench的會話 2 建立測試表 注意 unsigned auto increment primary key用法 預設引擎的設定 建立測試表 use te...