mysql事務總結 mysql事務特點總結

2021-10-17 17:57:57 字數 1320 閱讀 4685

1.mysql事務有4個隔離級別,以及會出現的問題如下圖:

2. 髒讀:

開啟事務a,b。事務a在還沒有提交的情況下,假如第一次查詢id=1的使用者的age=24。事務b執行了update 表 set age = 100 where id = 1; b事務並沒有提交,緊接著再次查詢id=1的使用者的age時,age變成了其他值,這時事務a**現了髒讀。

解決辦法: 在事務中,讀取資料的時候加共享鎖。 select ... lock in share mode;

3. 不可重複讀:

什麼是不可重複讀?舉例說明,兩個事務a, b。兩個事務查詢結果都是id=1的使用者age=24,id=2的使用者age=25。這時a執行update 表 set age = 100 where id = 1; 這時a還沒有提交,b也沒有提交,b來查詢id=1的使用者age還是=24,然後a執行commit。此時b再次查詢id=1的使用者的age就=100,事務b並沒有重複讀取到之前id=1記錄的狀態。

不可重複讀和髒讀的區別就在於,修改了資料的事務有沒有執行commit。沒有提交,另一事務資料隔離性出現問題叫髒讀;提交了,另一事務資料隔離性出現問題叫不可重複讀。

解決辦法:給每個事務增加客戶端快照--可重複讀隔離級別。

4. 幻讀:

兩個事務a,b。兩個事務一開始 select * from '表' 查詢出來的資料都是一樣的,假如是5行記錄,把這時資料狀態稱為"資料狀態1"。這時,事務ainsert一條記錄,然後commit。這時b查詢select * from '表',資料還是"資料狀態1",5行資料,然後執行update '表' set column='***',看下面返回的rows matched: 會是6,比5行多一行!然後再執行select * from '表',返回了6行資料!多出了一行,好像之前5行的資料是幻覺一樣。這種情況,就叫幻讀。

解決辦法: mvcc,多版本控制,也叫樂觀鎖。

5.檢視會話的隔離級別:

select @@global.tx_isolation;

6. 修改會話的隔離級別:

set tx_isolation='read-committed';

7. 可序列化隔離級別最高,通過對更改操作(cud)加排他鎖,查詢操作加共享鎖,沒有客戶端快照 來實現的。除了兩個事務都是執行的select操作,不阻塞另一事務外。其他交替出現的操作都會阻塞另一事務,知道該事務commit。

8. 如果乙個事務a(任何隔離級別下)對某行記錄執行了更改操作,這時乙個普通操作(非事務)也對該行記錄執行更改操作的化,會被阻塞,直到事務a commit.

mysql事務總結

1 簡 介 mysql 框架本身不直接支援事務,而由引擎實現。常用引擎中,僅 innodb 支援事務,myisam 和 heap 引擎皆不支援事務,下文對事務的介紹皆以 innodb 為準。mysql框架提供多條語句用於操作事務,常用語句如下 start transaction commit rol...

mysql sql 事務寫作 mysql中的事務

事務 事務是一組原子性sql查詢語句,被當作乙個工作單元。若mysql對改事務單元內的所有sql語句都正常的執行完,則事務操作視為成功,所有的sql語句才對資料生效,若sql中任意不能執行或出錯則事務操作失敗,所有對資料的操作則無效 通過回滾恢復資料 事務有四個屬性 原子性 事務被認為不可分的乙個工...

mysql 設定唯讀事務 Spring 唯讀事務

transactional readonly true 這東西不叫唯讀事務,它只是建立了乙個唯讀的資料庫連線。transactional裡面還有個引數,叫isolation這個才是控制隔離級別的。spring提供了5種事務隔離級別予以解決 1 default預設級別 default為資料來源 資料庫...