標籤:blog http io ar java sp 資料 on 問題
事務的特性:
1) 原子性(atomicity):事務是資料庫的邏輯工作單位,而且是必須是原子工作單位,對於其資料修改,要麼全部執行,要麼全部不執行。
2) 一致性(consistency):事務在完成時,必須是所有的資料都保持一致狀態。在相關資料庫中,所有規則都必須應用於事務的修改,以保持所有資料的完整性。
3) 隔離性(isolation):一個事務的執行不能被其他事務所影響。
4) 持久性(durability):一個事務一旦提交,事物的操作便永久性的儲存在DB中。即使此時再執行復原操作也不能撤消所做的更改。
事務(Transaction):是並發控制的單元,是使用者定義的一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。通過事務,sql server 能將邏輯相關的一組操作綁定在一起,以便伺服器 保持資料的完整性。事務通常是以begin transaction開始,以commit或rollback結束。Commint表示提交,即提交事務的所有操作。具體地說就是將事務中所有對資料的更新寫回到磁碟上的物理資料庫中去,事務正常結束。Rollback表示復原,即在事務啟動並執行過程中發生了某種故障,事務不能繼續進行,系統將事務中對資料庫的所有已完成的操作全部撤消,滾回到事務開始的狀態。
自動認可事務:每條單獨的語句都是一個事務。每個語句後都隱含一個commit。 (預設)
明確交易:以begin transaction顯示開始,以commit或rollback結束。
隱含交易:當串連以隱含交易模式進行操作時,sql server資料庫引擎執行個體將在提交或復原當前事務後自動啟動新事務。無須描述事物的開始,只需提交或復原每個事務。但每個事務仍以commit或rollback顯式結束。串連將隱性事務模式設定為開啟之後,當資料庫引擎執行個體首次執行下列任何語句時,都會自動啟動一個隱含交易:alter table,insert,create,open ,delete,revoke ,drop,select, fetch ,truncate table,grant,update在發出commit或rollback語句之前,該事務將一直保持有效。在第一個事務被提交或復原之後,下次當串連執行以上任何語句時,資料庫引擎執行個體都將自動啟動一個新事務。該執行個體將不斷地產生隱性事務鏈,直到隱性事務模式關閉為止。
Java JDBC事務機制
首先,我們來看看現有JDBC操作會給我們打來什麼重大問題,比如有一個業務:當我們修改一個資訊後再去查詢這個資訊,看是這是一個簡單的業務,實現起來也非常容易,但當這個業務放在多線程高並發的平台下,問題自然就出現了,比如當我們執行了一個修改後,在執行查詢之前有一個線程也執行了修改語句,這是我們再執行查詢,看到的資訊就有可能與我們修改的不同,為瞭解決這一問題,我們必須引入JDBC事務機制,其實代碼實現上很簡單,一下給出一個原理實現例子供大家參考:
private Connection conn = null;
private PreparedStatement ps = null;
try {
conn.setAutoCommit(false); //將自動認可設定為false
ps.executeUpdate("修改SQL"); //執行修改操作
ps.executeQuery("查詢SQL"); //執行查詢操作
conn.commit(); //當兩個操作成功後手動提交
} catch (Exception e) {
conn.rollback(); //一旦其中一個操作出錯都將復原,使兩個操作都不成功
e.printStackTrace();
}
與事務相關的理論
1.事務(Transaction)的四個屬性(ACID)
原子性(Atomic) 對資料的修改要麼全部執行,要麼全部不執行。
一致性(Consistent) 在事務執行前後,資料狀態保持一致性。
隔離性(Isolated) 一個事務的處理不能影響另一個事務的處理。
持久性(Durable) 交易處理結束,其效果在資料庫中持久化。
2.事務並發處理可能引起的問題
髒讀(dirty read) 一個事務讀取了另一個事務尚未提交的資料,
不可重複讀取(non-repeatable read) 一個事務的操作導致另一個事務前後兩次讀取到不同的資料
幻讀(phantom read) 一個事務的操作導致另一個事務前後兩次查詢的結果資料量不同。
舉例:
事務A、B並發執行時,
當A事務update後,B事務select讀取到A尚未提交的資料,此時A事務rollback,則B讀到的資料是無效的"髒"資料。
當B事務select讀取資料後,A事務update操作更改B事務select到的資料,此時B事務再次讀去該資料,發現前後兩次的資料不一樣。
當B事務select讀取資料後,A事務insert或delete了一條滿足A事務的select條件的記錄,此時B事務再次select,發現查詢到前次不存在的記錄("幻影"),或者前次的某個記錄不見了。
JDBC的事務支援
JDBC對事務的支援體現在三個方面:
1.自動認可模式(Auto-commit mode)
Connection提供了一個auto-commit的屬性來指定事務何時結束。
a.當auto-commit為true時,當每個獨立SQL操作的執行完畢,事務立即自動認可,也就是說每個SQL操作都是一個事務。
一個獨立SQL操作什麼時候算執行完畢,JDBC規範是這樣規定的:
對資料操作語言(DML,如insert,update,delete)和資料定義語言 (Data Definition Language)(如create,drop),語句一執行完就視為執行完畢。
對select語句,當與它關聯的ResultSet對象關閉時,視為執行完畢。
對預存程序或其他返回多個結果的語句,當與它關聯的所有ResultSet對象全部關閉,所有update count(update,delete等語句操作影響的行數)和output parameter(預存程序的輸出參數)都已經擷取之後,視為執行完畢。
b. 當auto-commit為false時,每個事務都必須顯示調用commit方法進行提交,或者顯示調用rollback方法進行復原。auto-commit預設為true。
JDBC提供了5種不同的交易隔離等級,在Connection中進行了定義。
2.交易隔離等級(Transaction Isolation Levels)
JDBC定義了五種交易隔離等級:
TRANSACTION_NONE JDBC驅動不支援事務
TRANSACTION_READ_UNCOMMITTED 允許髒讀、不可重複讀取和幻讀。
TRANSACTION_READ_COMMITTED 禁止髒讀,但允許不可重複讀取和幻讀。
TRANSACTION_REPEATABLE_READ 禁止髒讀和不可重複讀取,單運行幻讀。
TRANSACTION_SERIALIZABLE 禁止髒讀、不可重複讀取和幻讀。
3.儲存點(SavePoint)
JDBC定義了SavePoint介面,提供在一個更細粒度的事務控制機制。當設定了一個儲存點後,可以rollback到該儲存點處的狀態,而不是rollback整個事務。
Connection介面的setSavepoint和releaseSavepoint方法可以設定和釋放儲存點。
JDBC規範雖然定義了事務的以上支援行為,但是各個JDBC驅動,資料庫廠商對事務的支援程度可能各不相同。如果在程式中任意設定,可能得不到想要的效果。為此,JDBC提供了DatabaseMetaData介面,提供了一系列JDBC特性支援情況的擷取方法。比如,通過DatabaseMetaData.supportsTransactionIsolationLevel方法可以判斷對交易隔離等級的支援情況,通過DatabaseMetaData.supportsSavepoints方法可以判斷對儲存點的支援情況。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/lhfqq/archive/2010/01/31/5274775.aspx
Java的JDBC事務詳解