商城網(wǎng)站怎么做推廣網(wǎng)站廣告調(diào)詞軟件
一、介紹:
1、介紹:
在計(jì)算機(jī)術(shù)語中,事務(wù)(Transaction)是訪問并可能更新數(shù)據(jù)庫中各種數(shù)據(jù)項(xiàng)的一個程序執(zhí)行單元(unit)。事務(wù)是恢復(fù)和并發(fā)控制的基本單位。
2、事務(wù)的4大特性
原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。
2.1、原子性(Atomicity):
事務(wù)是一個原子操作,它要么全部成功,要么全部失敗回滾。如果事務(wù)中的任何操作失敗,則所有操作都將回滾到之前的狀態(tài),以確保數(shù)據(jù)庫中的數(shù)據(jù)不會被部分更改。
2.2、一致性(Consistency):
事務(wù)的執(zhí)行必須使數(shù)據(jù)庫從一個一致狀態(tài)轉(zhuǎn)換到另一個一致狀態(tài)。這意味著事務(wù)必須滿足所有約束條件,以保持?jǐn)?shù)據(jù)的完整性和一致性。
2.3、隔離性(Isolation):
并發(fā)事務(wù)的執(zhí)行不能相互干擾。事務(wù)必須在獨(dú)立的空間內(nèi)執(zhí)行,這意味著它們看起來像是在獨(dú)占訪問數(shù)據(jù)庫。
2.4、持久性(Durability):
一旦事務(wù)完成提交,其結(jié)果就是永久性的,并且即使在系統(tǒng)故障的情況下,也必須能夠恢復(fù)這些結(jié)果。
注意,在firebird中,開啟事務(wù)的方式是讓調(diào)用程序使用StartTransaction(開啟事務(wù))、COMMIT(提交事務(wù))和ROLLBACK(撤銷事務(wù))。
3、并發(fā)事務(wù)遇到問題:
(1)贓讀:一個事務(wù)讀到另外一個事務(wù)還沒有提交的數(shù)據(jù)。
(2)不可重復(fù)讀:一個事務(wù)先后讀取同一條記錄,但兩次讀取的數(shù)據(jù)不同,稱之為不可重復(fù)讀。
(3)幻讀:一個事務(wù)按照條件查詢數(shù)據(jù)時,沒有對應(yīng)的數(shù)據(jù)行,但是在插入數(shù)據(jù)時,又發(fā)現(xiàn)這行數(shù)據(jù)已經(jīng)存在,好像出現(xiàn)了 "幻影"。
二、事務(wù)隔離級別
1、四種隔離級別
?為了解決并發(fā)事務(wù)所引發(fā)的問題,在數(shù)據(jù)庫中引入了事務(wù)隔離級別。主要有以下幾種:(Serializable安全性最高,Uncommitted安全性最差)
之所以默認(rèn)下第三個,是因?yàn)槭聞?wù)隔離級別越高,數(shù)據(jù)越安全,但是性能越低。
(1)查看事務(wù)隔離級別
SELECT @@TRANSACTION_ISOLATION;
(2)設(shè)置事務(wù)隔離級別
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE }?
2、mysql保障事務(wù)四大特性
2.1、原子性、一致性、持久化
實(shí)際上是由InnoDB中的兩份日志來保證的,一份是redo log日志,一份是undo log日志。
(1)redo log:重做日志,負(fù)責(zé)記錄的是事務(wù)提交時數(shù)據(jù)頁的物理修改,即哪一頁哪一行哪個字段做了什么修改。當(dāng)數(shù)據(jù)庫發(fā)生故障時,redo log可以用來恢復(fù)未完成的事務(wù),實(shí)現(xiàn)事務(wù)的持久性。分為重做日志緩沖(redo log buffer)以及重做日志文件(redo log file),前者是在內(nèi)存中,后者在磁盤中。
(2)undo log:回滾日志,主要作用是在事務(wù)進(jìn)行修改操作但還未提交之前,先記錄下原始的數(shù)據(jù)狀態(tài)。這樣,當(dāng)事務(wù)因?yàn)槟承┰蛐枰貪L或數(shù)據(jù)庫發(fā)生故障時,可以利用undo log中的信息將數(shù)據(jù)恢復(fù)到事務(wù)開始前的狀態(tài)。 作用包含兩個 : 提供回滾(保證事務(wù)的原子性) 和MVCC(多版本并發(fā)控制) 。
(3)MVCC :全稱 Multi-Version Concurrency Control,多版本并發(fā)控制。指維護(hù)一個數(shù)據(jù)的多個版本,使得讀寫操作沒有沖突,快照讀為MySQL實(shí)現(xiàn)MVCC提供了一個非阻塞讀功能。MVCC的具體實(shí)現(xiàn),還需要依賴于數(shù)據(jù)庫記錄中的三個隱式字段、undo log日志、readView。
注:隱式字段:我們創(chuàng)建表(id,name,age)后,插入數(shù)據(jù)時,InnoDB還會自動的給我們添加三個隱藏字段,前兩個字段是肯定會添加的, 是否添加最后一個字段DB_ROW_ID,得看當(dāng)前表有沒有主鍵,如果有主鍵,則不會添加該隱藏字段。
2.2、持久性:
是通過數(shù)據(jù)庫的鎖,加上MVCC來保證的。