3分钟了解数据库事务
事務(wù)是由幾個讀取和修改數(shù)據(jù)的sql命令組成的,但是知道commit命令被執(zhí)行之后,修改操作才被認為是正常的完成。顯式事務(wù)常以Begin tran語句開頭,以commit tran或者rollback tran語句結(jié)尾的。
事務(wù)具有acid屬性
原子性(atomicity):原子性指的是每個事務(wù)要不提交(commit)要不終止(rollback)。比如現(xiàn)實中的轉(zhuǎn)賬
一致性(consistency):一致性屬性確保事務(wù)不允許系統(tǒng)到達一個不準(zhǔn)確的邏輯狀態(tài)-數(shù)據(jù)必須總是保持邏輯上的正確。及時在發(fā)生系統(tǒng)故障時,約束和規(guī)則也必須得到承兌。
隔離性(isolation):隔離性會將并發(fā)事務(wù)與其他未完成事務(wù)的更新操作分離開。隔離性主要是解決并發(fā)事務(wù)出現(xiàn)的 臟讀、不可重復(fù)讀、幻讀現(xiàn)象,根據(jù)自己的業(yè)務(wù)場景選擇對應(yīng)的隔離級別;
持久性(durability):當(dāng)事務(wù)提交以后,數(shù)據(jù)庫的持久性屬性就會確保事務(wù)的作用持續(xù)存在。
?事務(wù)總是全部支持這四種acid屬性的。但是可能會初選一些另外的行為,常叫做‘一致性問題’。他們僅僅可能存在的行為,而用戶對于隔離級別的選擇決定下列這些行為哪種是被允許的。
Case1
事務(wù)A,先執(zhí)行,處于未提交的狀態(tài)
?
事務(wù)B,后執(zhí)行
?
?如果事務(wù)B能夠讀取到(name為lisi)這條記錄,事務(wù)A就對事務(wù)B產(chǎn)生了影響,這個影響叫做“讀臟”,讀到了未提交事務(wù)操作的記錄。
Case2
事務(wù)A先執(zhí)行
?
?
事務(wù)B,后執(zhí)行,并且提交
?
事務(wù)A,在此執(zhí)行相同的查詢,結(jié)果name:zhaosi
?
這次是已提交事務(wù)B對事務(wù)A產(chǎn)生的影響,這個影響叫做“不可重復(fù)讀”(重點為update),一個事務(wù)內(nèi)相同的查詢,得到了不同的結(jié)果。
?Case3
事務(wù)A,先執(zhí)行,1條結(jié)果:
?
事務(wù)B,后執(zhí)行,并且提交;
?
事務(wù)A,在此查詢?yōu)閮蓷l,莫名其妙多出了一條
?
這次是已提交事務(wù)B對事務(wù)A產(chǎn)生的影響,這個影響叫做“幻讀”。(重點在insert,delete)
為了解決多個事務(wù)并發(fā)會引發(fā)的問題,進行并發(fā)控制。數(shù)據(jù)庫提供了四種事務(wù)隔離級別供用戶選擇。
Read Uncommitted?讀未提交
Read Committed?讀已提交
Repeatable Read?可重復(fù)讀
Serializable?串行化
?
總結(jié)
以上是生活随笔為你收集整理的3分钟了解数据库事务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Zend创始人离职原来早已安排好
- 下一篇: 为什么我不喜欢数据库三范式