spring分布式事务示例_Spring声明式事务示例

spring分布式事务示例

事务是具有ACID (原子,一致,隔离和持久)属性的工作单元。 原子意味着所有更改都发生或什么都没有发生。 如果从一个帐户借钱并记入另一个帐户,则交易将确保借记和贷项均已完成或均未完成。 一致表示更改使数据保持一致状态。 孤立表示更改不会干扰其他更改。 持久表示更改一旦提交,就保持提交。

资源管理器(如关系数据库)提供事务管理器和用于控制事务的API。 那些熟悉JDBC的人会知道,由于设置autocommit = true,默认情况下会启动事务。 每个更改数据库的语句都会自动提交。 可以通过将autocommit设置为false来更改此行为。 现在,程序员必须显式开始事务,然后提交或回滚该事务。

仅处理一种资源(例如一个数据库)的事务称为本地事务。 跨多个资源(例如多个数据库或一个数据库和一个消息传递引擎)的事务称为全局事务。 全局事务是使用XA协议实现的,该协议涉及两阶段提交。 JTA规范描述了Java API,供程序员使用全局事务。 JDBC中的事务方法(例如开始,提交,回滚)仅适用于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分布式事务示例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么单例模式是邪恶的(译)

原文链接&#xff1a;http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx 虽然这篇文章不是我写的&#xff0c;但我完全同意文章中的观点。Brian Button可能是我所知道的最有才的人之一。我相信他会喜欢你们的反馈的。 1、单例模式经常被用来为某些服务提供…

java properties 保存_Java 读写Properties配置文件

转自&#xff1a;https://www.cnblogs.com/xudong-bupt/p/3758136.html1.Properties类与Properties配置文件Properties类继承自Hashtable类并且实现了Map接口&#xff0c;也是使用一种键值对的形式来保存属性集。不过Properties有特殊的地方&#xff0c;就是它的键和值都是字符…

自动加密可序列化的类

在Coursera安全性最高项目的验尸讨论中提出了一个疯狂的想法。 类可以在序列化期间对其自身进行加密吗&#xff1f; 这主要是一项学术性的“假设”练习。 很难想到这样一种情况&#xff0c;我们希望在持久性期间依靠对象自加密而不是使用显式加密机制。 我只能确定一种情况&am…

java垃圾回收机制优化_JVM性能优化--Java的垃圾回收机制

一、Java内存结构1、Java堆(Java Heap)java堆是java虚拟机所管理的内存中最大的一块&#xff0c;是被所有线程共享的一块内存区域&#xff0c;在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例&#xff0c;这一点在Java虚拟机规范中的描述是&#xff1a;所有的对象实…

《linux 网卡别名的添加和绑定》RHEL6

网卡别名的配置&#xff1a; 这个和ifconfig临时修改网卡ip 差不多&#xff0c;但是不一样。都是临时的&#xff0c;只要重启电脑就没了。 配永久的ip别名&#xff1a; cp ifcfg-eth0 ifcfg-eth0:0 vim ifcfg-eth0:0 这样做也能出来&#xff0c;对不对就不知道了 重启网络就ok…

NGUI中UILabel使用url标签的一个bug

在NGUI里&#xff0c;UILabel控件可以支持一些简单功能的标签&#xff0c;使文本显示更丰富及实现类似超链接的功能。但是在使用的时候发现了NGUI3.5.9版本里存在着一个bug。不过还好修复这个bug也很简单。 在UILabel中支持[urllink]text[/url]的方式来定义类超链接的文本。bug…

web前端模块化开发_真正的模块化Web应用程序:为什么没有开发标准?

web前端模块化开发OSGI &#xff0c; SpringSource &#xff0c; Jboss模块 &#xff0c;J2EE和清单永远不会结束。所有这些技术都向他们的最终用户/开发人员保证了相同的东西&#xff0c;或多或少是Java模块化Web应用程序&#xff08;&#xff1f;&#xff09;。 但是&#xf…

[转]Oracle DB管理内存

• 描述SGA 中的内存组件• 实施自动内存管理• 手动配置SGA 参数• 配置自动PGA 内存管理内存管理&#xff1a;概览DBA 必须将内存管理视为其工作中至关重要的部分&#xff0c;因为&#xff1a;• 可用内存空间量有限• 为某些类型的功能分配更多内存可提高整体性能• 自动优化…

java request获取文件_request获取路径方式

从request获取各种路径总结request.getRealPath("url"); // 虚拟目录映射为实际目录request.getRealPath("./"); // 网页所在的目录request.getRealPath("../"); // 网页所在目录的上一层目录request.getContextPath(); // 应用的web目录的…

servlet 3.0异步_Servlet 3.0异步处理可将服务器吞吐量提高十倍

servlet 3.0异步Servlet是Java中处理服务器端逻辑的主要组件&#xff0c;新的3.0规范引入了一些非常有趣的功能&#xff0c;其中异步处理是最重要的功能之一。 可以利用异步处理来开发高度可伸缩的Web应用程序。 使用此功能可以有效地构建Web 2.0站点和AJAX应用程序。 我们的JC…

Android自定义进度条-带文本(文字进度)的水平进度条(ProgressBar)

/** * 带文本提示的进度条 */ public class TextProgressBar extends ProgressBar { private String text; private Paint mPaint; public TextProgressBar(Context context) { super(context); initText(); } public TextProgressBar(Context context, AttributeSet attrs, in…

java 获取服务器网络名_java-siger java使用siger 获取服务器硬件信息(CPU 内存 网络 io等) - 下载 - 搜珍网...

java读取系统信息/java读取系统信息/hyperic-sigar-1.6.4/java读取系统信息/hyperic-sigar-1.6.4.zipjava读取系统信息/hyperic-sigar-1.6.4/AUTHORSjava读取系统信息/hyperic-sigar-1.6.4/bindings/java读取系统信息/hyperic-sigar-1.6.4/bindings/dotnet/java读取系统信息/hy…

《无码的青春》第四章 程序员的二象性,左手流氓,右手疯子

“道哥&#xff0c;你都30了&#xff0c;怎么还不考虑成家的事情啊”&#xff0c;张小凡问到。 其实他不了解道哥的过去&#xff0c;当年道哥搞javaABC论坛的时候&#xff0c;有一个javaABC官方扯淡群&#xff0c;里面聚集了一群程序员&#xff0c;从不讨论技术&#xff0c;唯…

java导出highcharts_Highcharts导出代码Java版

Highcharts是一个用纯JavaScript编写的图表库&#xff0c;提供了一个交互式的图表添加到您的网站或Web应用程序的简单方法。Highcharts目前支持线&#xff0c;样条&#xff0c;面积&#xff0c;areaspline&#xff0c;柱形图&#xff0c;条形图&#xff0c;饼图和散点图类型。同…

smartgwt_SmartGWT入门,提供出色的GWT界面

smartgwtSmartGWT简介 我最近开始使用SmartGWT &#xff0c;它是一个基于GWT的框架&#xff0c;该框架为您的应用程序UI提供了一个全面的小部件库&#xff0c;并为服务器端的数据管理提供了帮助。 您可以在SmartGWT展示柜上查看其漂亮的功能。 我准备了一个简短的“入门”指南…

java录入会员信息_java-第三章-升级我行我素购物管理系统,实现会员信息录入的功能...

import java.util.Scanner;public class A01 {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubScanner input new Scanner (System.in);System.out.println("我行我素购物管理>客户信息管理>添加客户信息");Sy…

Beaglebone Back学习五(PWM测试)

PWM测试 参考链接 1 Enable PWM on BeagleBone with Device Tree overlays 2 Using PWM on the Beaglebone Black 3 Beaglebone Coding 101: Buttons and PWM 4 Using PWM outputs 5 beaglebone-black-cpp-PWM 6 Enabling PWM Support in the kernel 7转载于:https://www.cnblo…

CUBA平台的理念

最近发生了很多事。 在CUBA于6月1日正式发布之后&#xff0c;我们推出了一个新版本&#xff0c;在一些Java网站上发布了我们的第一篇文章&#xff0c;并在伦敦的Devoxx UK会议上介绍了该平台 。 但是在热潮继续之前&#xff0c;大约是时候阐明CUBA背后的哲学了。 与企业软件开…

mysql orderby多个_MySQL OrderBy

MySQL会为每个线程分配一个内存(sort_buffer)用于排序&#xff0c;该内存小大为 sort_buffer_size如果排序的数量小于 sort_buffer_size&#xff0c;排序将会在内存中完成。如果排序数据量很大&#xff0c;内存中无法存下这么多数据&#xff0c;则会使用磁盘临时文件来辅助排序…

java 双重检查锁_Java中可怕的双重检查锁定习惯用法

java 双重检查锁本文讨论的问题不是新问题&#xff0c;但即使是经验丰富的开发人员也仍然很棘手。 单例模式是常见的编程习惯用法。 但是&#xff0c;当与多个线程一起使用时&#xff0c;必须进行某种类型的同步&#xff0c;以免破坏代码。 在相关文章中&#xff0c;我们的JCG合…