事務並發運行的問題介紹
●對於同時運行的多個事務,當這些事務訪問數據庫中相同的數據時,如果沒有采取必要的隔離機制,就會導致各種並發問題:
➢ 臟讀:對於兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的字段.之后,若T2回滾,T1讀取的內容就是臨時且無效的.
➢ 臟讀:對於兩個事務T1,T2,T1讀取了已經被T2更新但還沒有被提交的字段.之后,若T2回滾,T1讀取的內容就是臨時且無效的.
➢ 不可重復讀:對於兩個事務T1, T2, T1讀取了一個字段,然后T2更新了該字段之后,T1再次讀取同一個字段,值就不同了,
➢ 幻讀:對於兩個事務T1,T2,T1從一個表中讀取了一個字段,然后T2在該表中插入了一些新的行.之后,如果T1再次讀取同一個表,就會多出幾行
● 數據庫事務的隔離性 :數據庫系統必須具有隔離並發運行各個事務的能力,使它們不會相互影響,避免各種並發問題.
●一個事務與其他事務隔離的程度稱為隔離級別,數據庫規定了多種事務隔離級別,不同隔離級別對應不同的干擾程度,
隔離級別越高,數據一致性就越好,但並發性越弱.
利用事務隔離級別解決上述三種問題
利用事務隔離級別解決上述三種問題
➢數據庫提供的4種事務隔離級別:
READ UNCOMMITTED(讀未提交數據) 允許事務讀取未被其他事物提交的變更臟讀,不可重復讀和幻讀的問題都會出現
READ COMMITED(讀已提交數據) 只允許事務讀取已經被其它事務提交的變更,可以避免臟讀. 但不可重復讀和幻讀問題仍然可能出現
REPEATABLE READ(可重復讀) 確保事務可以多次從一個字段中讀取相同的值.在這個事務持續期問,禁止其他事物對這個字段進行更新.可以避免臟讀和不可重復讀,但幻讀的問題仍然存在.
SERIALIZABLE(串 行化) 確保事務可以從一個表中讀取相同的行在這個事務持續期間,禁止其他事務對該表執行插入,更新和刪除操作.所有並發問題都可以避免,但性能十分低下.

➢Oracle支持的2種事務隔離級別: READ COMMITED,SERIALIZABLE。Oracle默認的事務隔離級別為:READ COMMITED
➢Mysql支持4種事務隔離級別.Mysql默認的事務隔離級別為: REPEATABLE READ
➢查看隔離級別
select @@tx_isolation; # @@transaction_isolation 為在mysql 5.7的別名 select @@transaction_isolation; # mysql 8.0的話,第一個被棄用了,需要用第二個
➢設置隔離級別
set session transaction isolation level 隔離級別; #設置當前的事務的隔離級別 set global transaction isolation level 隔離級別; #設置全局的事務的隔離級別 #session和global 可以不寫,默認為session
