事務的併發問題 mysql為例

2021-08-21 03:35:37 字數 2691 閱讀 8515

1)髒讀:事務a讀取了事務b更新的資料,然後事務b回滾,那麼事務a讀取到的資料就是髒資料

2)不可重複讀:事務a多次讀取同一資料,事務b在事務a多次讀取的過程中對資料做了更新並提交,導致事務a多次讀取同一資料的結果不一致,側重於修改

3)幻讀: 系統管理員a將資料庫中所有的學生的成績從具體分數改為abcd等級,同時系統管理員b插入了或刪除了一條具體分數的記錄,導致a發現結束後還有一條資料沒有改過來或是丟失了,就好像出現了幻覺一樣

sessiona:

1)設定隔離級別read-uncommited

2)開啟事務 start transaction

3) 查詢

sessionb:

1) 設定隔離級別read-uncommited

2) 開啟事務 start transaction

3) update

session a:

4)再次查詢

發現sessiona 讀取到了 sessionb中的更改,出現了髒讀

sessiona:

1)設定隔離級別read commited

2)開啟事務 start transaction

3) 查詢

select * from account;

select @@tx_isolation;

setsession

transaction

isolation

level

read committed;

select * from account;

3) 查詢

sessionb:

1) 設定隔離級別read-commited

2) 開啟事務 start transaction

3) update

4) commit

set

session

transaction

isolation

level

read committed;

start

transaction;

update account set balance = balance -50

where id =1

select * from account;

sessiona:

5) 查詢,

不能讀取sessionb 未能commit 的改動,但是能讀取到sessionb中已經commit的改動

sessiona:

1)設定隔離級別repeatable read

2)開啟事務 start transaction

3) 查詢

sessionb:

1)設定隔離級別repeatable read

2)開啟事務 start transaction

3) insert or update

4) commit

sessiona:

4) 再次查詢,又再次查詢……多次查詢, 發現不能讀取sessionb已經提交的改動,實現了可重複讀

5) commit;

6) 再次查詢(注意是commit後查詢),發現可以讀取sessionb已經提交的改動, 但是4)和該步驟 的查詢結果不一樣, 出現了幻讀

sessiona:

1)設定隔離級別serializable

2)開啟事務 start transaction

3) 查詢

sessionb:

1)設定隔離級別serializable

2)開啟事務 start transaction

3) 查詢,可以查詢到,但比較慢

4)insert or update ,經過漫長等待後,發現insert or update 均沒有成功

sessiona:

4)commit;

sessionb:

5)insert or update

6) 查詢 ,發現insert or update 成功了!!!

補充:1、sql規範所規定的標準,不同的資料庫具體的實現可能會有些差異

2、mysql中預設事務隔離級別是可重複讀時並不會鎖住讀取到的行

3、事務隔離級別為讀提交時,寫資料只會鎖住相應的行

4、事務隔離級別為可重複讀時,如果有索引(包括主鍵索引)的時候,以索引列為條件更新資料,會存在間隙鎖間隙鎖、行鎖、下一鍵鎖的問題,從而鎖住一些行;如果沒有索引,更新資料時會鎖住整張表。

5、事務隔離級別為序列化時,讀寫資料都會鎖住整張表

6、隔離級別越高,越能保證資料的完整性和一致性,但是對併發效能的影響也越大,魚和熊掌不可兼得啊。對於多數應用程式,可以優先考慮把資料庫系統的隔離級別設為read committed,它能夠避免髒讀取,而且具有較好的併發效能。儘管它會導致不可重複讀、幻讀這些併發問題,在可能出現這類問題的個別場合,可以由應用程式採用悲觀鎖或樂觀鎖來控制。

事務的併發問題

1 髒讀 事務a讀取了事務b更新的資料,然後b回滾操作,那麼a讀取到的資料是髒資料 2 不可重複讀 事務 a 多次讀取同一資料,事務 b 在事務a多次讀取的過程中,對資料作了更新並提交,導致事務a多次讀取同一資料時,結果 不一致。3 幻讀 系統管理員a將資料庫中所有學生的成績從具體分數改為abcde...

Mysql事務,併發問題,鎖機制

1 什麼是事務 事務是一條或多條資料庫操作語句的組合,具備acid,4個特點。原子性 要不全部成功,要不全部撤銷 隔離性 事務之間相互獨立,互不干擾 一致性 資料庫正確地改變狀態後,資料庫的一致性約束沒有被破壞 永續性 事務的提交結果,將持久儲存在資料庫中 2 事務併發會產生什麼問題 1 第一類丟失...

事務 二 事務的併發問題

事務是併發操作的基本單位,保證事務acdi特性是事務處理的重要任務,而事務acdi特性遭到破壞的乙個直接原因就是是多個事務對資料庫 共享資源 的併發操作引起的,為了保證事務的隔離性與一致性。dbms必須對事物進行合理正確的排程。由於事物的併發操作可能導致事務之間進行交織操作,可能會出現資料不一致的問...