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