在connection類中提供了3個控制事務的方法:
(1) setautocommit(boolean autocommit):設定是否自動提交事務;
(2) commit();提交事務;
(3) rollback();撤消事務;
在jdbc api中,預設的情況為自動提交事務,也就是說,每一條對資料庫的更新的sql語句代表一項事務,操作成功後,系統自動呼叫commit()來提交,否則將呼叫rollback()來撤消事務。
try
//事物提交
conn.commit();
//事物的回滾
conn.rollback();
//6.釋放資源
resultset.close();
st.close();
conn.close();
}catch (exception e)
spring註解處理事物
@transactional
springboot 專案在程式入口加上註解@enabletransactionmanagement , 開啟事務註解
引數名稱功能描述:
readonly 該屬性用於設定當前事務是否為唯讀事務,設定為true表示唯讀,false則表示可讀寫,預設值為false。
例如:@transactional(readonly=true)
rollbackfor
該屬性用於設定需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,則進行事務回滾。
例如:指定單一異常類:@transactional(rollbackfor=runtimeexception.class)指定多個異常類:@transactional(rollbackfor=)
rollbackforclassname 該屬性用於設定需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,則進行事務回滾。例如:指定單一異常類名稱@transactional(rollbackforclassname=」runtimeexception」)指定多個異常類名稱:@transactional(rollbackforclassname=)
norollbackfor 該屬性用於設定不需要進行回滾的異常類陣列,當方法中丟擲指定異常陣列中的異常時,不進行事務回滾。例如:指定單一異常類:@transactional(norollbackfor=runtimeexception.class)指定多個異常類:@transactional(norollbackfor=)
norollbackforclassname 該屬性用於設定不需要進行回滾的異常類名稱陣列,當方法中丟擲指定異常名稱陣列中的異常時,不進行事務回滾。例如:指定單一異常類名稱:@transactional(norollbackforclassname=」runtimeexception」)指定多個異常類名稱:@transactional(norollbackforclassname=)
propagation 該屬性用於設定事務的傳播行為。例如:@transactional(propagation=propagation.not_supported,readonly=true)
isolation 該屬性用於設定底層資料庫的事務隔離級別,事務隔離級別用於處理多事務併發的情況,通常使用資料庫的預設隔離級別即可,基本不需要進行設定
timeout 該屬性用於設定事務的超時秒數,預設值為-1表示永不超時
4. 事務屬性
事務隔離級別
髒讀 : 乙個事務讀取到另一事務未提交的更新資料
不可重複讀 : 在同一事務中, 多次讀取同一資料返回的結果有所不同, 換句話說,
後續讀取可以讀到另一事務已提交的更新資料. 相反, "可重複讀"在同一事務中多次
讀取資料時, 能夠保證所讀資料一樣, 也就是後續讀取不能讀到另一事務已提交的更新資料
幻讀 : 乙個事務讀到另乙個事務已提交的insert資料
隔離級別是指若干個併發的事務之間的隔離程度。transactiondefinition 介面中定義了五個表示隔離級別的常量:
transactiondefinition.isolation_default:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是transactiondefinition.isolation_read_committed。
transactiondefinition.isolation_read_uncommitted:該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀,不可重複讀和幻讀,因此很少使用該隔離級別。比如postgresql實際上並沒有此級別。
transactiondefinition.isolation_read_committed:該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。
transactiondefinition.isolation_repeatable_read:該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。該級別可以防止髒讀和不可重複讀。
transactiondefinition.isolation_serializable:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。
事務傳播行為
所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。
在transactiondefinition定義中包括了如下幾個表示傳播行為的常量:
transactiondefinition.propagation_required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。這是預設值。
transactiondefinition.propagation_requires_new:建立乙個新的事務,如果當前存在事務,則把當前事務掛起。
transactiondefinition.propagation_supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
transactiondefinition.propagation_not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。
transactiondefinition.propagation_never:以非事務方式執行,如果當前存在事務,則丟擲異常。
transactiondefinition.propagation_mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
transactiondefinition.propagation_nested:如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於transactiondefinition.propagation_required。
transaction裡面的引數
引數 作用
value 指定使用的事務管理器
propagation 可選的事務傳播行為設定
isolation 可選的事務隔離級別設定
readonly 讀寫或唯讀事務,預設讀寫
timeout 事務超時時間設定
rollbackfor 導致事務回滾的異常類陣列
rollbackforclassname 導致事務回滾的異常類名字陣列
norollbackfor 不會導致事務回滾的異常類陣列
norollbackforclassname 不會導致事務回滾的異常類名字陣列
事務超時
所謂事務超時,就是指乙個事務所允許執行的最長時間,如果超過該時間限制但事務還沒有完成,則自動回滾事務。在 transactiondefinition 中以 int 的值來表示超時時間,其單位是秒。
預設設定為底層事務系統的超時值,如果底層資料庫事務系統沒有設定超時值,那麼就是none,沒有超時限制。
事務唯讀屬性
唯讀事務用於客戶**唯讀但不修改資料的情形,唯讀事務用於特定情景下的優化,比如使用hibernate的時候。
預設為讀寫事務。
transactional的**使用
@service
public class deleteserviceimp implements deleteservice else
} else
return result;
}}
JDBC基礎和JDBC的事物
開始 註冊驅動 class.forname com.mysql.jdbc.driver mysql的註冊驅動方式 jdbc執行sql 語句的兩種方式 方式一 這種有sql注入的風險,建議不要使用 statement stat con.createstatement 查詢 stat.executequ...
Spring事物管理
spring 事物的管理是申明式事物,通過在spring的xml檔案中配置3個元件,來管理整個專案的事物.最初事物的概念是在資料庫中提出的,為了保證資料的安全性.事物通俗的說就是原子的操作流程,符合acid,分別為原子性,一致性,隔離性,永久性.原子性是指事物中多張表的資料操作,要嘛全部成功,如其中...
spring 事物配置
struts hibernate spring整合開發web應用是相當流行的,只需要簡單的配置就能輕鬆的對資料庫進行crud操作,下面就hibernate spring的配置做一下剖析,一邊與大家一起分享經驗 1 準備工作 可以利用hibernate tools生成相關對映檔案已經po物件 dao物...