Spring聲明式事務示例

事務是具有ACID (原子的,一致的,隔離的和持久的)屬性的工作單元。 原子意味著所有更改都發生或什么都沒有發生。 如果從一個帳戶借錢并貸記到另一個帳戶,則交易將確保借記和貸項均已完成或均未完成。 一致表示更改使數據保持一致狀態。 孤立表示更改不會干擾其他更改。 持久意味著更改一旦提交,就保持提交。

關系數據庫等資源管理器提供了一個事務管理器和一個用于控制事務的API。 熟悉JDBC的人會知道,由于設置autocommit = true,默認情況下將啟動事務。 每個更改數據庫的語句都會自動提交。 可以通過將autocommit設置為false來更改此行為。 現在,程序員必須顯式開始事務,然后提交或回滾該事務。

僅處理一種資源(例如一個數據庫)的事務稱為本地事務。 跨多個資源(例如多個數據庫或一個數據庫和一個消息傳遞引擎)的事務稱為全局事務。 全局事務是使用XA協議實現的,該協議涉及兩階段提交。 JTA規范描述了Java API,供程序員使用全局事務。 JDBC中的事務方法(例如begin,commit,rollback)僅適用于JDBC和關系數據庫,而JTA可以與任何事務資源一起使用。

但是,涉及事務處理的代碼是可以由框架處理的樣板代碼。 在方法開始時,您需要開始一個事務,并且在方法完成時,您需要提交或回滾該事務。 如果您使用過EJB,可能會很熟悉,您可以在部署描述符中指定方法應在其中執行的事務環境。 例如,您可能會說RequiresNew,這意味著在調用該方法之前啟動一個新事務。 容器在調用方法之前啟動新事務,并在方法返回時提交新事務。 程序員不需要編寫任何Java代碼來處理事務。

在本文的其余部分,我們將通過一個示例討論使用Spring進行聲明式事務管理。

對于本教程,您將需要:

(1) Spring3.0
(2) Eclipse是可選的。 我使用eclipse作為我的IDE。 Eclipse使您可以導出可以部署到Tomcat的戰爭。 但是您也可以使用其他IDE或命令行工具。 (3)您可以從springjdbcwithTransaction.zip下載此示例的源代碼。

我們重新使用了JDBC和Spring博客中的示例,該博客是我們之前寫的。 讓我們為MemberSpringJDBCDAO添加事務支持。 此類具有insertMember方法,該方法將成員插入數據庫。 讓我們稍微修改一下方法,以在插入數據庫后拋出RuntimeException。 添加了運行時異常,以假裝在更新數據庫時業務邏輯中發生了錯誤。

public int insertMember(Member member) {JdbcTemplate jt = getJdbcTemplate() ;Object[] params = new Object[{member.getFirstname(),member.getLastname(),member.getStreet(),member.getCity(),member.getZip(),member.getEmail(),member.getPassword()} ;int ret = jt.update(insert_sql, params) ;throw new RuntimeException("simulate Error condition') ;return ret ;
}

在這種方法中,您是否希望將插入內容提交給數據庫? 答案是肯定的,盡管這不是理想的行為。 JDBC的默認行為是autocommit = true,這意味著每個插入或更新都將立即提交。 您可以設置autocommit = false,并在方法末尾顯式提交或回滾。 但是讓您的容器處理此問題要容易得多。

要將聲明式事務管理添加到上述方法中,請使用以下步驟:

步驟1:在springjdbcdao.xml中定義一個事務管理器

<bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"/>

Spring與事務管理器一起開始和完成事務。

步驟2:啟用對交易注釋的支持

添加到springjdbcdao.xml

<tx:annotation-driven transaction-manager="txManager"/>

步驟3:將@Transactional批注添加到insertMember方法

@Transactional
public int insertMember(Member member) {
...

@Transactional可以接受屬性,但我們將使用以下默認值:

傳播方式:必填

必需表示需要進行交易。 如果沒有事務,Spring將請求事務管理器啟動一個事務。 其他可能的值是Requires_New,它告訴事務管理器始終掛起現有事務并開始一個新事務。

隔離級別:默認

使用基礎資源管理器的默認隔離級別。

回滾:任何運行時異常都會觸發回滾

步驟4:使用Junit測試MemberSpringJDBCDAOTest運行更新的insertMember方法。

您將從事務管理器中看到以下日志,指示該事務已回滾。

org.springframework.jdbc.datasource.DataSourceTransactionManager –啟動事務回滾
2501 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager –啟動事務回滾
2501 [main] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager –在Connection [org.apache.derby.impl.jdbc.EmbedConnection40@13320911(XID = 2827),(SESSIONID = 1),(DATABASE = c:\ manoj \ mjprojects \ database \ pumausers)(DRDAID = null)2501 [main]調試org.springframework.jdbc.datasource.DataSourceTransactionManager –在Connection [org.apache.derby.impl.jdbc]上回滾JDBC事務。 EmbedConnection40 @ 13320911(XID = 2827),(SESSIONID = 1),(數據庫= c:\ manoj \ mjprojects \ database \ pumausers),(DRDAID = null)] 2511

使用SQL檢查數據庫表。 確認未添加任何記錄。

步驟5:從insertMember方法中刪除runtimeexception,然后再次運行測試。

Spring調試日志顯示了事務已提交。 使用SQL檢查數據庫表。 確認記錄已添加到表中。

總之,事務對于維護數據源的ACID屬性是必需的。 使用Spring的聲明式事務使該任務更加容易。

參考: The Khangaonkar報告中來自我們的JCG合作伙伴 Manoj的Spring和聲明性交易 。

相關文章 :

  • YouTube Java API入門
  • Google Guava庫必需品
  • Java Code Geeks Andygene Web原型
  • 使用Spring Security保護GWT應用程序

翻譯自: https://www.javacodegeeks.com/2011/09/spring-declarative-transactions-example.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

路徑 (Path)–nodejs

本模塊包含一套用于處理和轉換文件路徑的工具集。幾乎所有的方法只做字符串變換&#xff0c; 不會調用文件系統檢查路徑是否有效。 通過 require(path) 來加載此模塊。以下是本模塊所提供的方法&#xff1a; path.normalize(p) 規范化字符串路徑&#xff0c;注意 .. 和 . 部分 …

OllyDBG反匯編快速找到程序入口一點分析

出處&#xff1a;http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先聲明下&#xff1a;這個和脫殼沒關系&#xff0c;不是找殼里面的程序入口哦&#xff0c;只是程序本身的入口&#xff0c;個別朋友不要誤會哈。其實這個應該是基礎&#xff0c;但我經常找…

簡單的Twitter:Heroku上的Play框架,AJAX,CRUD

因此&#xff0c;重大的公告發布了– Heroku開始為Play Framework應用程序提供本機支持&#xff01; 如果您還沒有聽說過&#xff0c;請在Heroku的博客上查看Jesper Joergensen的帖子 。 因此&#xff0c;對于演示&#xff0c;我將建立一個非常基本的Twitter副本&#xff1b; 它…

Cron表達式

CronTrigger CronTriggers往往比SimpleTrigger更有用&#xff0c;如果您需要基于日歷的概念&#xff0c;而非SimpleTrigger完全指定的時間間隔&#xff0c;復發的發射工作的時間表。CronTrigger&#xff0c;你可以指定觸發的時間表如“每星期五中午”&#xff0c;或“每個工作日…

深入理解JavaScript學習筆記(3)_全面解析Module模式

簡介 Module模式是JavaScript編程中一個非常通用的模式&#xff0c;一般情況下&#xff0c;大家都知道基本用法&#xff0c;本文嘗試著給大家更多該模式的高級使用方式。 首先我們來看看Module模式的基本特征&#xff1a; 模塊化&#xff0c;可重用封裝了變量和function&#x…

匯編----乘指令: MUL、IMUL

MUL: 無符號乘 ;影響 OF、CF 標志位;指令格式:;MUL r/m ;參數是乘數;如果參數是 r8/m8, 將把 AL 做乘數, 結果放在 AX;如果參數是 r16/m16, 將把 AX 做乘數, 結果放在 EAX;如果參數是 r32/m32, 將把 EAX 做乘數, 結果放在 EDX:EAX IMUL: 有符號乘 ;影響 OF、CF 標志位;…

Google App Engine Java功能和命名空間API

功能API 使用Capabilities API&#xff0c;您的應用程序可以檢測特定API功能的停機和計劃停機時間。 您可以使用此API來檢測應用程序何時不可用&#xff0c;然后繞過它來減少應用程序的停機時間。 我們該如何處理&#xff0c;這是個折衷方案&#xff1f; 1.優雅&#xff1a;創…

破解key file時經常用到的幾個API函數及其用法

CreateFile函數 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP計劃任務之關閉瀏覽器后仍然繼續執行的函數

函數名稱&#xff1a;ignore_user_abort 本函數配置或取得使用端連接中斷后&#xff0c;PHP 程序是否仍繼續執行。默認值為中斷連接后就停止執行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 選項就是配置處。本功能在 PHP 3.0.7 版之后才開始提供。 官方說明…

node--更新數據庫問題

昨天測試blog的comment功能&#xff0c;在新增comment相關的代碼之后&#xff0c;重啟應用&#xff0c;出現Cannot call method forEach of undefined 。反復核對代碼&#xff0c;都沒發現異常&#xff0c;最后將數據庫文件刪除之后&#xff0c;再重啟數據庫&#xff0c;一切正…

U盤做完啟動盤,如何恢復原始容量

&#xff08;1&#xff09;右擊“我的電腦”&#xff0c;選擇“管理”選項&#xff0c;之后選擇“磁盤管理”&#xff0c;查看自己U盤的索引&#xff0c;如&#xff1a;Disk 1&#xff08;2&#xff09;在運行窗口&#xff0c;輸入cmd&#xff0c;回車&#xff0c;出現Dos運行環…

GWT Spring和Hibernate進入數據網格世界

利用Infinispan數據網格的功能最大化Hibernate性能。 一個GWT &#xff0c; Spring &#xff0c; JPA &#xff0c; Hibernate &#xff0c; Infinispan集成教程。 在本教程中&#xff0c;我們將討論如何將Infinispan用作Hibernate二級緩存提供程序。 Infinispan是JBoss緩存的…

記對一個key file crackme的破解

crackme下載地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 遞歸 及 分組匯總 高級部分(多維數據集)

UNION 等集合操作符&#xff1a;UNION 等以第一個 SELECT 的 列明 作為 整個結果集的列明&#xff0c;整個結果集 唯一認可的 唯一邏輯處理階段 是 ORDER BY 這個意思是說 只有 ORDER BY 是對整個結果集作用的&#xff0c;其它都操作都作用在 UINON 兩側的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好&#xff0c; 我們很高興地宣布&#xff0c;一組Maven原型的第一個版本已經發布&#xff01;&#xff01;&#xff01; 該集合的目的是提供可以滿足各種開發需求的項目模板。 您可以在本文末尾找到JCG路線圖。 該第一個發行版旨在提供項目模板-Web應用程序的體系結構。 …

關于如何用od反匯編win32 控制臺程序

*********************************************************** 如何用od反匯編win32 控制臺程序(類似dos程序&#xff09;呢&#xff1f;*********************************************************** 注&#xff1a;od是用來調試win32程序的 1.反編譯win32 控制臺程序&…

Chrome/Chromium HTML5 video 視頻播放硬件加速

Chromium站點上有個大致的框圖。描寫敘述了Chromium的video在各個平臺 - 包含Android - 上是怎樣使用硬件資源來做視頻編解碼加速的&#xff1a; 而依據Android Kitkat上的Chromium代碼分析&#xff0c;HTML5 video播放硬件加速&#xff0c;終于是使用MediaCodec.java來利用本地…

.net mvc結合微軟提供的FormsAuthenticationTicket登陸

一、Web.config <system.web><compilation debug"true" targetFramework"4.5" /><httpRuntime targetFramework"4.5" /><authentication mode"Forms"><forms loginUrl"/Sign/SignIn" defaultUrl…

vc6.o--fatal error C1010錯誤的解決

當編譯c文件時&#xff0c;出錯信息為&#xff1a;fatal error C1010: unexpected end of file while looking for precompiled header directive 解決方案&#xff1a; 1、如果發生錯誤的文件是由其他的C代碼文件添加進入當前工程而引起的&#xff0c;則AltF7進入當前工程的…