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.mzph.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进入当前工程的…