事務(wù)就是一系列的操作,這些操作完成一項(xiàng)任務(wù).只要這些操作里有一個(gè)操作沒(méi)有成功,事務(wù)就操作失敗,發(fā)生回滾事件.即撤消前面的操作,這樣可以保證數(shù)據(jù)的一致性.而且可以把操作暫時(shí)放在緩存里,等所有操作都成功有提交數(shù)據(jù)庫(kù),這樣保證費(fèi)時(shí)的操作都是有效操作.
如果沒(méi)有特殊聲明,事務(wù)就是指數(shù)據(jù)庫(kù)事務(wù)簡(jiǎn)單的講就是對(duì)數(shù)據(jù)庫(kù)表的添加、刪除、修改和查詢操作。
從編程的角度來(lái)說(shuō)事務(wù)可由程序員來(lái)設(shè)置,(何時(shí)開(kāi)啟,何時(shí)提交,何時(shí)回滾)如果沒(méi)有設(shè)置則按數(shù)據(jù)庫(kù)默認(rèn)自動(dòng)劃分事務(wù)。而事務(wù)最終在數(shù)據(jù)庫(kù)上執(zhí)行.所以要求數(shù)據(jù)庫(kù)支持事務(wù)。
事務(wù)具有四個(gè)特征:原子性( Atomicity )、一致性( Consistency )、隔離性( Isolation )和持續(xù)性( Durability )。這四個(gè)特性簡(jiǎn)稱為 ACID 特性。
1 、原子性
事務(wù)是數(shù)據(jù)庫(kù)的邏輯工作單位,事務(wù)中包含的各操作要么都做,要么都不做
2 、一致性
事務(wù)執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫(kù)從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。因此當(dāng)數(shù)據(jù)庫(kù)只包含成功事務(wù)提交的結(jié)果時(shí),就說(shuō)數(shù)據(jù)庫(kù)處于一致性狀態(tài)。如果數(shù)據(jù)庫(kù)系統(tǒng) 運(yùn)行中發(fā)生故障,有些事務(wù)尚未完成就被迫中斷,這些未完成事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改有一部分已寫入物理數(shù)據(jù)庫(kù),這時(shí)數(shù)據(jù)庫(kù)就處于一種不正確的狀態(tài),或者說(shuō)是 不一致的狀態(tài)。
3 、隔離性
一個(gè)事務(wù)的執(zhí)行不能其它事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)其它并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。
4 、持續(xù)性
也稱永久性,指一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)的改變就應(yīng)該是永久性的。接下來(lái)的其它操作或故障不應(yīng)該對(duì)其執(zhí)行結(jié)果有任何影響。
數(shù)據(jù)庫(kù)系統(tǒng)是允許多個(gè)用戶共享數(shù)據(jù)庫(kù)資源,尤其是多個(gè)用戶可以同時(shí)存取相同數(shù)據(jù)。(多用戶同時(shí)對(duì)一個(gè)表操作也就是并發(fā))
我們主觀上雖不想這么做,可是這種情況是存在的,沒(méi)有原因。而并發(fā)會(huì)破壞事務(wù)ACID特性 (隔離性,一致性)。
并發(fā)會(huì)帶來(lái)下列問(wèn)題:
臟讀:一個(gè)事務(wù)讀取了未提交的事務(wù)
不可重復(fù)讀:同一個(gè)事務(wù)中多次讀取同一個(gè)數(shù)據(jù)返回的結(jié)果不同
幻讀:一個(gè)事務(wù)讀取到了另一個(gè)事務(wù)已提交的insert數(shù)據(jù)。
如果應(yīng)用程序使用完全隔離的事務(wù),那么同時(shí)執(zhí)行多個(gè)事務(wù)的效果將與串行執(zhí)行(一個(gè)接一個(gè)的順序執(zhí)行)完全等效。為解決事務(wù)之間的并發(fā)帶來(lái)的個(gè)問(wèn)題,必須在事務(wù)之間建立隔離關(guān)系(使用隔離級(jí)別)。
事務(wù)的隔離級(jí)別:就是對(duì)事務(wù)并發(fā)控制的等級(jí),ANSI/ISO SQL將其分為串行化(SERIALIZABLE)、可重復(fù)讀(REPEATABLE READ)、讀已提交(READ COMMITED)、讀未提交(READ UNCOMMITED)四個(gè)等級(jí)
1 Serializable:最嚴(yán)格的級(jí)別,事務(wù)串行執(zhí)行,資源消耗最大;
2 REPEATABLE READ:讀取數(shù)據(jù)的事務(wù)允許其他事務(wù)繼續(xù)訪問(wèn)該行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問(wèn)該行。避免了“臟讀取”和“不可重復(fù)讀取”的情況,但是帶來(lái)了更多的性能損失。
3 READ COMMITTED:大多數(shù)主流數(shù)據(jù)庫(kù)的默認(rèn)事務(wù)等級(jí),保證了一個(gè)事務(wù)不會(huì)讀到另一個(gè)并行事務(wù)已修改但未提交的數(shù)據(jù),避免了“臟讀取”。該級(jí)別適用于大多數(shù)系統(tǒng)。
4 Read Uncommitted:最低的事務(wù)隔離級(jí)別,保證了讀取過(guò)程中不會(huì)讀取到非法數(shù)據(jù)。
隔離級(jí)別 |
臟讀 |
不可重復(fù)讀 |
幻讀 |
Serializable |
不會(huì) |
不會(huì) |
不會(huì) |
REPEATABLE READ |
不會(huì) |
不會(huì) |
會(huì) |
READ COMMITTED |
不會(huì) |
會(huì) |
會(huì) |
Read Uncommitted |
會(huì) |
會(huì) |
會(huì) |
數(shù)據(jù)庫(kù)采用鎖機(jī)制來(lái)實(shí)現(xiàn)事務(wù)的隔離性。
共享鎖:共享鎖用于讀取數(shù)據(jù)操作,它允許其他事務(wù)同時(shí)讀取某鎖定的資源,但不允許其他事務(wù)更新它。
排他鎖:排它鎖用于修改數(shù)據(jù)的場(chǎng)合。它鎖定的資源,其他事務(wù)不能讀取也不能修改。
更新鎖:更新鎖在更新操作的初始化階段用來(lái)鎖定可能要被修改的資源,從而避免使用共享鎖造成的死鎖現(xiàn)象
常見(jiàn)的并發(fā)控制鎖
http://hahalzb.blogbus.com/logs/19150842.html 心晴怡然