数据库中事务并发问题
生活随笔
收集整理的這篇文章主要介紹了
数据库中事务并发问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,
如果沒有采取必要的隔離機制。就會導致各種并發問題:
- 臟讀: 對于兩個事務T1,T2, T1讀取了已經被T2更新但還沒有被提交的字段
之后,若T2回滾,T1讀取的內容就是臨時且無效的。 - 不可重復讀:對于兩個事務T1,T2,T1讀取了一個字段,然后T2更新了該字段之后,
T1再次讀取同一個字段,值就不同了。 - 幻讀:對于兩個事務T1,T2,T1從一個表中讀取了一個字段,
然后T2在該表中插入了一些新的行之后,如果T1再次讀取同一個表,就會多出幾行。
數據庫事務的隔離性:
數據庫系統必須具有隔離并發運行各個事務的能力, 使它們不會互相影響,避免各種并發問題。一個事務與其他事務隔離的程度稱為隔離級別。
數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,
隔離級別越高,數據一致性就越好,但并發性越弱。
| READ UNCOMMITTED(讀未提交數據) | 允許事務讀取未被其他事務提交的變更。臟讀,不可重復讀和幻讀的問題都會出現 |
| READ COMMITED(讀已提交數據) | 只允許事務讀取已經被其他事務提交的變更,可以避免臟讀,但不可重復讀和幻讀問題仍然存在 |
| REPEATABLE READ(可重復讀) | 確保事務可以多次從一個字段中讀取相同的值,在這個事務持續期間,禁止其他事務對于這個字段進行更新,可以避免臟讀和不可重復讀,但幻讀的問題仍然存在 |
| SERIALIZABLE(串行化) | 確保事務可以從一個表中讀取相同的行,在這個事務持續期間,禁止其他事務對該表執行插入,更新和刪除操作,所有并發問題都可以避免,但性能十分低下 |
Oracle 支持2種事務隔離級別: READ COMMITED , SERIALIZABLE。
Oracle默認的事務隔離級別為READ COMMITED。
Mysql支持4種事務隔離級別。Mysql默認的事務隔離級別為: REPEATABLE READ。
總結
以上是生活随笔為你收集整理的数据库中事务并发问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell中自定义函数
- 下一篇: SQL之语句分类