數(shù)據(jù)庫事務(wù)四個特性 數(shù)據(jù)庫事務(wù)需要滿足四個特性,ACID,即原子性(Atomic),一致性(Consistency),隔離性(Isolation),持久性(Durability)。 在關(guān)系數(shù)據(jù)庫中,這些特性需要借助借助redo log、鎖、snapshot等手段來實現(xiàn)。 隔離性要求各事務(wù)之間相互獨立,所進
數(shù)據(jù)庫事務(wù)四個特性
數(shù)據(jù)庫事務(wù)需要滿足四個特性,ACID,即原子性(Atomic),一致性(Consistency),隔離性(Isolation),,持久性(Durability)。
在關(guān)系數(shù)據(jù)庫中,這些特性需要借助借助redo log、鎖、snapshot等手段來實現(xiàn)。
隔離性要求各事務(wù)之間相互獨立,所進行的操作不會相互影響,其用意還是保證各數(shù)據(jù)讀寫操作的一致性
標準SQL92規(guī)范定義了四種隔離級別,以及相應(yīng)要禁止的三種現(xiàn)象(Phenomena)。
隔離級別越高,數(shù)據(jù)一致性的保證越強,但同時數(shù)據(jù)庫的并發(fā)能力也越差。 數(shù)據(jù)庫并發(fā)操作引起的問題(現(xiàn)象 ) 有:
1. 臟讀(Dirty read)。
事務(wù)A讀取了事務(wù)B中尚未提交的數(shù)據(jù)。如果事務(wù)B回滾,則A讀取使用了錯誤的數(shù)據(jù)。
2. 不可重復度(Unrepeatable read)。
在事務(wù)A多次的讀取過程中,事務(wù) B對數(shù)據(jù)進行了修改,導致事務(wù)A多次讀取的數(shù)據(jù)不一致。
3. 幻讀(Phantom read)。
在事務(wù)A多次讀取構(gòu)成中,事務(wù)B對數(shù)據(jù)進行了新增操作,導致事務(wù)A多次讀取的數(shù)據(jù)不一致?;米x和不可重復讀的區(qū)別在于,
不可重復是針對記錄的update操作,只要在記錄上加寫鎖,就可避免;幻讀是對記錄的insert操作,
要禁止幻讀必須加上全局的寫鎖(比如在表上加寫鎖)。 另外說一下兩類丟失更新:
4. 第一類丟失更新(回滾丟失,Lost update)。
在事務(wù)A期間,事務(wù) B對數(shù)據(jù)進行了更新;在事務(wù)A撤銷之后,覆蓋了事務(wù)B已經(jīng)提交的數(shù)據(jù)。SQL92沒有定義這種現(xiàn)象,標準定義的所有隔離界別都不允許第一類丟失更新發(fā)生。
5. 第二類丟失更新(覆蓋丟失, Second lost update)。
在事務(wù)A期間,事務(wù)B對數(shù)據(jù)進行了更新;在事務(wù)A提交之后,覆蓋了事務(wù)B已經(jīng)提交的數(shù)據(jù)。第二類丟失更新,實際上和不可重復讀是同一種問題。
SQL92定義的四種隔離級別:
1. 未提交讀(Read uncommitted)。
寫操作加寫鎖,讀操作不加鎖。禁止第一類丟失更新,但是會出現(xiàn)所有其他數(shù)據(jù)并發(fā)問題。
2.提交讀(Read committed)。
寫操作加寫鎖,讀操作加讀鎖。禁止第一類丟失更新和臟讀。這是大部分關(guān)系數(shù)據(jù)庫的默認 隔離級別。
3.可重復讀(Read repeatable)。
對于讀操作加讀鎖到事務(wù)結(jié)束,其他事務(wù)的更新操作只能等到事務(wù)結(jié)束之后進行。和提交 讀的區(qū)別在于,
提交讀的讀操作是加讀鎖到本次讀操作結(jié)束,可重復讀的鎖粒度更大。禁止兩類丟失更新,禁止臟讀和不可 重復度,但是可能出現(xiàn)幻讀.
4.序列化(Serializable)。
讀操作加表級讀鎖至事務(wù)結(jié)束??梢越够米x。
第一類丟失更新 不可重復讀 臟讀 第二類丟失更新 幻讀
Read uncommitted 禁止 不禁止 不禁止 不禁止 不禁止
Read committed 禁止 禁止 不禁止 不禁止 不禁止
Read repeatable 禁止 禁止 禁止 禁止 不禁止
Serializable 禁止 禁止 禁止 禁止 禁止
大多數(shù)關(guān)系數(shù)據(jù)庫默認使用Read committed的隔離級別,Mysql InnoDB默認使用Read repeatable的隔離級別,
這和Mysql replication 機制使用Statement日志格式有關(guān)。各數(shù)據(jù)庫隔離級別的實現(xiàn)也是有差別的,
例如Oracle支持Read committed 和Serializable兩種隔離級別,
另外可以通過使用讀快照在Read committed級別上禁止不可重復讀問題;
Mysql InnoDB在Read repeatable級別上使用next-key locking 策略來避免幻讀現(xiàn)象的產(chǎn)生。
posted on
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com