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