事務(transaction)基本概念
一.什麼是事務
事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。
事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中乙個步驟失敗,將發生回滾操作,撤消撤消之前到事務開始時的所以操作。
二.事務的 acid
事務具有四個特徵:原子性( atomicity )、一致性( consistency )、隔離性( isolation )和持續性( durability )。這四個特性簡稱為 acid 特性。
1 、原子性
事務是資料庫的邏輯工作單位,事務中包含的各操作要麼都做,要麼都不做
2 、一致性
事務執行的結果必須是使資料庫從乙個一致性狀態變到另乙個一致性狀態。因此當資料庫只包含成功事務提交的結果時,就說資料庫處於一致性狀態。如果資料庫系統執行中發生故障,有些事務尚未完成就被迫中斷,這些未完成事務對資料庫所做的修改有一部分已寫入物理資料庫,這時資料庫就處於一種不正確的狀態,或者說是不一致的狀態。
3 、隔離性
乙個事務的執行不能其它事務干擾。即乙個事務內部的操作及使用的資料對其它併發事務是
隔離的,併發執行的各個事務之間不能互相干擾。
4 、持續性
也稱永久性,指乙個事務一旦提交,它對資料庫中的資料的改變就應該是永久性的。接下來的其它操作或故障不應該對其執行結果有任何影響。
二.事務的屬性
乙個事務的屬性控制了事務的使用範圍。 ejb 、 spring 以及
.net下的事務屬性都很類似的, 事務屬性有如下幾種:
required:
如果在乙個事務中呼叫,就把該方法加到此事務中來
如果還沒有啟動事務,就啟動乙個新事務
requirednew:
不管當前有沒有事務,都會啟動乙個新事務,如果當前有事務,會被掛起直到方法結束。
notsupported:
不能在事務中執行此方法。如果有事務,將會被掛起直到方法結束。
supports:
如果當前有事務,此方法會加到當前事務,如果沒有,容器也不會啟動新事務。
mandatory:
必須在事務中呼叫此方法,否則丟擲異常。
never:
必須不在事務中呼叫此方法,否則丟擲異常。
三.事務的回滾
cmt 在以下兩中情況下,事務將回滾。第一,如果產生乙個系統異常,容器將自動回滾該事務。第二,通過呼叫 ejbcontext 介面 setrollbackonly 方法, bean 方法通知容器回滾該事務。如果 bean 丟擲乙個應用異常,事務將不會自動回滾,但可以呼叫 setrollbackonly 回滾。
四.事務超時
對於 ejb 中的容器管理事務,事務超時間隔是通過設定 default.properties 檔案中 ransaction.timeout 屬性的值來確定的,該檔案在 j2ee sdk 安裝目錄的 config 子目錄下。如下例將事務超時間隔設定為 5 秒鐘: transaction.timeout=5 ,這樣,當事務在 5 秒鐘內還沒有完成,容器將回滾該事務。
j2ee sdk 安裝後,超時間隔的預設值為 0 ,表示不計算超時,無論事務執行多長時間,除非異常出錯回滾,一直等待事務完成。
只有使用容器管理事務的企業 bean 才會受到 transaction.timeout 屬性值的影響。 bean 管理的 jta 事務使用 usertransaction 介面的 settransactiontimeout 方法來設定事務超時間隔。
五.隔離級別
事務不僅保證事務界限內的資料庫操作全部完成(或回滾)同時還隔離資料庫更新語句。隔離級別描述被修改的資料對其他事物的可見度。隔離級別的控制會跟具體的 dbms 廠商不同而不同。
隔離級別與併發性是互為矛盾的:隔離程度越高,資料庫的併發性越差;隔離程度越低,資料庫的併發性越好。
通過一些現象,可以反映出隔離級別的效果。這些現象有:
l更新丟失( lost update ):當系統允許兩個事務同時更新同一資料是,發生更新丟失。
l髒讀( dirty read ):當乙個事務讀取另乙個事務尚未提交的修改時,產生髒讀。
l非重複讀( nonrepeatable read ):事務多次
讀取同一行中的資料卻得到不同數值時。例如:事務1讀取了一行資料,而事務2改變或刪除了那些行並提交了修改。如果事務1再次讀取了那一行,那麼,事務1就得到了不同的數值(被更新或刪除)。
l幻像讀( phantom read ):一行資料滿足搜尋規則,卻在開始沒有被看到。例如:事務1讀取了一系列滿足搜尋規則的行,而事務2插入或刪除了乙個滿足事務1搜尋規則的行。如果事務1再次執行查詢語句,就會得到不同的一系列行。
sql-99 標準定義了下列隔離級別:
l未提交讀( read uncommitted )(隔離事務的最低級別,只能保證不讀取物理上損壞的資料)
l已提交讀( read committed )(資料庫引擎 的預設級別)當乙個事務執行在這個隔離級別時, 乙個 select 查詢只能看到查詢開始之前提交的資料,而永遠 無法看到未提交的資料,或者是在查詢執行時其他並行的事務提交做的改變。
l可重複讀( repeatable read ),不會髒讀和非重複讀,可能發生幻像讀 l
可序列化( serializable )(隔離事務的最高端別,事務之間完全隔離)
ansi/iso sql
隔離級別
隔離級別
髒讀(dirtyread)
不可重複的讀(non-repeatable read) 幻像
讀取(phantom read)
未提交讀
(read uncommitted)
可能
可能
可能
已提交讀
(read committed)
不可能
可能
可能
可重複讀(repeatable read)
不可能
不可能
可能
可序列化(serializable )
不可能
不可能
不可能
事務 Transaction 基本概念
事務 transaction 基本概念 一 什麼是事務 事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。也就是事務具有原子性,乙個事務中的一系列的操作要麼全部成功,要麼乙個都不做。事務的結束有兩種,當事務中的所以步驟全部成功執行時,事務提交。如果其中...
事務 Transaction 簡述
一 定義 二 應用場景 設想網上購物的一次交易,其付款過程至少包括以下幾步資料庫操作 正常的情況下,這些操作將順利進行,最終交易成功,與交易相關的所有資料庫資訊也成功地更新。但是,如果在這一系列過程中任何乙個環節出了差錯,例如在更新商品庫存資訊時發生異常 該顧客銀行帳戶存款不足等,都將導致交易失敗。...
事務 Transaction詳解
1 事務概念 一組sql語句操作單元,組內所有sql語句完成乙個業務,如果整組成功 意味著全部sql都實現 如果其中任何乙個失敗,意味著整個操作都失敗。失敗,意味著整個過程都是沒有意義的。應該是資料庫回到操作前的初始狀態。這種特性,就叫 事務 2 為什麼要存在事務?1 失敗後,可以回到開始位置 2 ...