Spring 事务管理
2016-02-20 23:03
435 查看
Spring 事务管理
什么是事务回滚?
举个例子:比如转账操作,甲先成功汇给乙现金,若乙没能取款成功,那么甲的现金就应该自动退还
Spring提供了很好的事务管理体系
Spring要进行事务管理,首先需要导入以下jar包:
cglib-nodep-2.1_3.jar
org.springframework.transaction-3.1.1.RELEASE.jar
以下是采用注解方式进行事务操作
1.在配置文件里面,首先配置Spring事务管理器:
![](http://s4.51cto.com/wyfs02/M00/7B/34/wKioL1bIfp7hHT2YAAAqkz-eK5I593.png)
引用jdbc包下的datasource下的DataSourceTransactionManager
当然,也同样要为它匹配数据源,即dataSource,因为我们要告诉事务管理器它操作的对象数据是谁
2.由于我们是采用注解方式操作事务,所以需要在配置文件中启动事务注解:
![](http://s3.51cto.com/wyfs02/M01/7B/34/wKioL1bIfsHScwXkAABAsfNTRXw418.png)
transaction-manager属性填写的就是上一步中的事务管理器
3.在需要进行事务管理的具体方法或具体类处进行注解:
![](http://s4.51cto.com/wyfs02/M02/7B/35/wKiom1bIfw7gIYeVAAB45qntHCE995.png)
在上例中,为这个类标记了:@Transactional(rollbackForClassName="RuntimeException")指的是这个类下的所有方法均赋予事务回滚操作
括号中的rollbackForClassName指的是一旦发生了指定异常,就自动进行事务回滚,例如此处指定了RuntimeException
为buy方法标记了:@Transactional(propagation=Propagation.REQUIRES_NEW),指的是赋予这个方法管理事务的标记,若当前类没有做标记而这个方法做了标记,则指只有这个方法可以操作事务
括号中的propagation是指事务的传播行为,默认是REQUIRED,指当这个事务被别的事务调用时,则进入到那个调用的事务中去
若按本例中设置为REQUIRES_NEW则指当这个事务被别的事务调用时,则先进行完当前事务,再进行那个调用的事务
以上可以举个通俗的例子:
比如甲有现金40,现在他买了两本书,一本20元,一本50元,那么他结账时按照正常来说应该是只能买得一本也就是那本20元的,而在事务管理中,结账就是一个事务,单独买每一本书也是一个事务,如果我们设置为REQUIRES,则表示按照结账时的事务来进行,也就是在结账第二本时发现余额不足,则结账事务回滚,导致第一本也买不成。
若我们设置成REQUIRED_NEW,则表示在结账第一本时,就应该先将结账这个整体事务先挂起,然后去调用买第一本书的事务,成功之后,回到整体事务,但是这个时候买第二本书,所以又会进入到买第二本书的事务,发现余额不足,所以买第二本不成功,买第二本回滚,但是不影响已经成功的第一本。所以我们才将其设置为REQUIRES_NEW。
事务回滚所需要的jar包请见文末。
附件:http://down.51cto.com/data/2367390
什么是事务回滚?
举个例子:比如转账操作,甲先成功汇给乙现金,若乙没能取款成功,那么甲的现金就应该自动退还
Spring提供了很好的事务管理体系
Spring要进行事务管理,首先需要导入以下jar包:
cglib-nodep-2.1_3.jar
org.springframework.transaction-3.1.1.RELEASE.jar
以下是采用注解方式进行事务操作
1.在配置文件里面,首先配置Spring事务管理器:
![](http://s4.51cto.com/wyfs02/M00/7B/34/wKioL1bIfp7hHT2YAAAqkz-eK5I593.png)
引用jdbc包下的datasource下的DataSourceTransactionManager
当然,也同样要为它匹配数据源,即dataSource,因为我们要告诉事务管理器它操作的对象数据是谁
2.由于我们是采用注解方式操作事务,所以需要在配置文件中启动事务注解:
![](http://s3.51cto.com/wyfs02/M01/7B/34/wKioL1bIfsHScwXkAABAsfNTRXw418.png)
transaction-manager属性填写的就是上一步中的事务管理器
3.在需要进行事务管理的具体方法或具体类处进行注解:
![](http://s4.51cto.com/wyfs02/M02/7B/35/wKiom1bIfw7gIYeVAAB45qntHCE995.png)
在上例中,为这个类标记了:@Transactional(rollbackForClassName="RuntimeException")指的是这个类下的所有方法均赋予事务回滚操作
括号中的rollbackForClassName指的是一旦发生了指定异常,就自动进行事务回滚,例如此处指定了RuntimeException
为buy方法标记了:@Transactional(propagation=Propagation.REQUIRES_NEW),指的是赋予这个方法管理事务的标记,若当前类没有做标记而这个方法做了标记,则指只有这个方法可以操作事务
括号中的propagation是指事务的传播行为,默认是REQUIRED,指当这个事务被别的事务调用时,则进入到那个调用的事务中去
若按本例中设置为REQUIRES_NEW则指当这个事务被别的事务调用时,则先进行完当前事务,再进行那个调用的事务
以上可以举个通俗的例子:
比如甲有现金40,现在他买了两本书,一本20元,一本50元,那么他结账时按照正常来说应该是只能买得一本也就是那本20元的,而在事务管理中,结账就是一个事务,单独买每一本书也是一个事务,如果我们设置为REQUIRES,则表示按照结账时的事务来进行,也就是在结账第二本时发现余额不足,则结账事务回滚,导致第一本也买不成。
若我们设置成REQUIRED_NEW,则表示在结账第一本时,就应该先将结账这个整体事务先挂起,然后去调用买第一本书的事务,成功之后,回到整体事务,但是这个时候买第二本书,所以又会进入到买第二本书的事务,发现余额不足,所以买第二本不成功,买第二本回滚,但是不影响已经成功的第一本。所以我们才将其设置为REQUIRES_NEW。
事务回滚所需要的jar包请见文末。
附件:http://down.51cto.com/data/2367390
相关文章推荐
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring整合Quartz(JobDetailBean方式)
- Spring整合Quartz(JobDetailBean方式)
- asp内置对象 ObjectContext 事务管理 详解
- 模拟Spring的简单实现
- spring+html5实现安全传输随机数字密码键盘
- Spring中属性注入详解
- SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
- struts2 spring整合fieldError问题
- spring的jdbctemplate的crud的基类dao
- 读取spring配置文件的方法(spring读取资源文件)
- Spring Bean基本管理实例详解
- java实现简单美女拼图游戏
- 详解Java的Spring框架中的事务管理方式
- 解析Java的Spring框架的BeanPostProcessor发布处理器
- Java开发框架spring实现自定义缓存标签
- java基本教程之线程休眠 java多线程教程
- JSP开发中在spring mvc项目中实现登录账号单浏览器登录