首頁  >  文章  >  Java  >  java中的事務之Spring事務(JDBC)

java中的事務之Spring事務(JDBC)

巴扎黑
巴扎黑原創
2017-06-26 11:26:181387瀏覽

事務的特性:

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)和資料定義語言(如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方法可以判斷對保存點的支援情況。


以上是java中的事務之Spring事務(JDBC)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn