事务是具有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

Spring声明式事务示例相关推荐

  1. Spring 声明式事务应该怎么学?

    1.引言 Spring 的声明式事务极大地方便了日常的事务相关代码编写,它的设计如此巧妙,以至于在使用中几乎感觉不到它的存在,只需要优雅地加一个 @Transactional 注解,一切就都顺理成章地 ...

  2. Spring 声明式事务在业务开发中容易碰到的坑总结

    Spring 声明式事务,在业务开发使用上可能遇到的三类坑,包括: 第一,因为配置不正确,导致方法上的事务没生效.我们务必确认调用 @Transactional 注解标记的方法是 public 的,并 ...

  3. Spring声明式事务管理、事务的传播行为xml配置

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 1. <tx:method name="insert*" propagat ...

  4. mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚

    mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 参考文章: (1)mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 (2)https://www.cnblog ...

  5. java spring 事务_java 事务与spring 声明式事务

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...

  6. 【Spring学习笔记 九】Spring声明式事务管理实现机制

    什么是事务?事务就是把一系列的动作当成一个独立的工作单元,这些动作要么全部完成,要么全部不起作用,关乎数据准确性的地方我们一定要用到事务,防止业务逻辑出错. 什么是事务管理,事务管理对于企业应用而言至 ...

  7. Spring声明式事务配置管理方法

    /*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...

  8. Spring声明式事务管理的配置详解

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  9. spring注解驱动开发-7 Spring声明式事务

    Spring 声明式事务 前言 @EnableTransactionManagement AutoProxyRegistrar InfrastructureAdvisorAutoProxyCreato ...

最新文章

  1. Hibernate是啥?
  2. JavaScript对象
  3. 关于建立完整商业应用软件框架库的设想
  4. ant-design圣诞彩蛋
  5. 将mysql中的数据库表导出和导入
  6. python 调用图灵机器人api实现简单的人机交互
  7. Java项目开发实战入门 PDF 扫描完整版
  8. 浅探PWM整流器的开环整流模式
  9. 最牛逼的技术能力,是技术领导力
  10. CNN——残差网络实现
  11. 运维派 » 你有自己的Web缓存知识体系吗?
  12. 《暗时间》----读书笔记
  13. 简单阶乘计算 (本题要求实现一个计算非负整数阶乘的简单函数)
  14. H5指北针JavaScript代码
  15. 阿里云学生成长计划资格考试分享
  16. python+appium自动化测试-获取短信+图片验证码
  17. 2.18 haas506 2.0开发教程 - 阿里云M2M设备间通信 - 规则引擎/Topic消息路由(仅支持2.2以上版本)
  18. seo里的长尾关键词是什么
  19. 谷歌浏览器插件:selenium元素定位器chropath
  20. HCIA-Security 学习笔记-1.1信息安全基础概念

热门文章

  1. arrays.sort(._Arrays.hashCode(Object [])与Objects.hash(Object…)
  2. java streams_使用Stream.peek在Java Streams内部进行窥视
  3. json怎么读取数据库_如何:使用Json插入数据库并从中读取
  4. javaio流层次结构_流的多层次分组
  5. gradle入门_Gradle入门:简介
  6. 管理多个Java安装
  7. java8 函数式编程_您必须学习Java 8的函数式编程吗?
  8. jax-rs jax-ws_创建一个简单的JAX-RS MessageBodyWriter
  9. Java是发展的垫脚石。 学习吧!
  10. jax-ws cxf_走向REST:将Tomcat嵌入Spring和JAX-RS(Apache CXF)