@Transactional spring 事务失效(转载)
原文地址:http://hwak.iteye.com/blog/1611970
1. 在需要事务管理的地方加@Transactional 注解。@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上 。
2. @Transactional 注解只能应用到 public 可见度的方法上 。 如果你在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。
3. 注意仅仅 @Transactional 注解的出现不足于开启事务行为,它仅仅 是一种元数据。必须在配置文件中使用配置元素,才真正开启了事务行为。
4. 通过 元素的 "proxy-target-class" 属性值来控制是基于接口的还是基于类的代理被创 建。 如果 "proxy-target-class" 属值被设置为 "true",那么基于类的代理将起作用(这时需要CGLIB库cglib.jar在CLASSPATH中)。如果 "proxy-target-class" 属值被设置为 "false" 或者这个属性被省略,那么标准的JDK基于接口的代理将起作用。
- <!-- JTA事务(非分布式事务), 事务配置的时候 ,不能指定dataSource属性(分布式事务,是有全局事务来管理数据库链接的)-->
- <!-- 标准的JDK基于接口的代理将起作用 -->
- <!-- aop切面 -->
- <aop:aspectj-autoproxy proxy-target-class="false" />
- <!-- 基于类的代理将起作用 ,同时 cglib.jar必须在CLASSPATH中 -->
- <!-- aop切面 -->
- <aop:aspectj-autoproxy proxy-target-class="true" />
注 解@Transactional cglib与java动态代理最大区别是代理目标对象不用实现接口, 那么注解要是写到接口方法上,要是使用cglib代理,这是注解事物就失效了,为了保持兼容注解最好都写到实现类方法上。
5. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上 。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承 的,这就意味着如果正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装。
6. @Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的 。
- public interface PersonageTempService {
- //删除指定id的Personage
- public void del(Integer Personageid) ;
- //删除指定id的Personage,flag
- public void del(Integer Personageid,boolean flag) ;
- }
- public class PersonageTempServiceBean implements PersonageTempService {
- private JdbcTemplate jdbcTemplate;
- public void del(Integer Personageid){
- try{
- this.del(Personageid,true)
- System.out.println("del success");
- }catch(Exception e){
- System.out.println("del failed");
- }
- }
- @Transactional
- //此时,事务根本就没有开启, 即数据库会默认提交该操作,即记录别删除掉
- public void del(Integer Personageid,boolean flag){
- if(flag == ture){
- jdbcTemplate.update("del from Personage where id=?", new Object[]{Personageid}, new int[]{java.sql.Types.INTEGER});
- throw new RuntimeException("运行期例外");
- }
- }
- }
- public class PersonageTempServiceBeanTest{
- PersonageTempService ps = new PersonageTempServiceBean ();
- ps.del(5);
- }
- }
7. Spring使用声明式事务处理,默认情况下, 如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback ;如果发生的异常是checked异常,默认情况下数 据库操作还是会提 交的。
- public interface PersonageService {
- //删除指定id的Personage
- public void del(Integer Personageid) ;
- //获取Personage
- public Personage getPersonage(Integer Personageid);
- }
- //PersonageServiceBean 实现了PersonageService 接口,则基于接口的还是基于类的代理 都可以实现事务
- @Transactional public class PersonageServiceBean implements PersonageService {
- private JdbcTemplate jdbcTemplate;
- //发生了unchecked异常,事务回滚, @Transactional
- public void del(Integer Personageid){
- jdbcTemplate.update("del from Personage where id=?", new Object[]{Personageid},
- new int[]{java.sql.Types.INTEGER});
- throw new RuntimeException("运行期例外");
- }
- }
- public interface PersonageService {
- //删除指定id的Personage
- public void delete(Integer Personageid) throws Exception;
- //获取Personage
- public Personage getPersonage(Integer Personageid);
- }
- @Transactional
- public class PersonageServiceBean implements PersonageService {
- //发生了checked异常,事务不回滚,即数据库记录仍能被删除,
- //checked的例外,需要我们在外部用try/catch语法对调用该方法的地方进行包含 @Transactional
- public void delete(Integer Personageid) throws Exception{
- jdbcTemplate.update("delete from Personage where id=?", new Object[]{Personageid},
- new int[]{java.sql.Types.INTEGER});
- throw new Exception("运行期例外");
- }
- }
但是,对于checked这种例外,默认情况下它是不会进行事务回滚的,但是 如果我们需要它进行事务回滚,这时候可以在delete方法上通过@Transaction这个注解来修改它的行为。
- @Transactional
- public class PersonServiceBean implements PersonService {
- @Transactional(rollbackFor=Exception.class)
- //rollbackFor这属性指定了,既使你出现了checked这种例外,那么它也会对事务进行回滚
- public void delete(Integer personid) throws Exception{
- jdbcTemplate.update("delete from person where id=?", new Object[]{personid},
- new int[]{java.sql.Types.INTEGER});
- throw new Exception("运行期例外");
- }
- }
在PersonServiceBean这个业务bean里面,有一些事务是不需要事务管理的,好比说获取数据的getPersons方法,getPerson方法。因为@Transactional 放在了类的上面。
此时,可 以采用propagation这个事务属性 @Transactional(propagation=Propagation.NOT_SUPPORTED),propagation这个属性指定了 事务传播行为,我们可以指定它不支持事务,当我们这么写了之后,Spring容器在getPersons方法执行前就不会开启事务 .
- @Transactional
- public class PersonServiceBean implements PersonService {
- @Transactional(propagation=Propagation.NOT_SUPPORTED)
- //则此方法 就不会开启事务了
- public Person getPerson(Integer personid)
- {
- }
- }
@Transactional spring 事务失效(转载)的更多相关文章
- @Transactional spring 事务(转载)
原文链接: http://www.cnblogs.com/sweetchildomine/p/6978037.html?utm_source=itdadao&utm_medium=referr ...
- Spring事务失效的原因
http://blog.csdn.net/paincupid/article/details/51822599 Spring事务失效的原因 5种大的原因 如使用mysql且引擎是MyISAM,则事务会 ...
- Spring事务失效的2种情况
使用默认的事务处理方式 因为在java的设计中,它认为不继承RuntimeException的异常是”checkException”或普通异常,如IOException,这些异常在java语法中是要求 ...
- java面试记录二:spring加载流程、springmvc请求流程、spring事务失效、synchronized和volatile、JMM和JVM模型、二分查找的实现、垃圾收集器、控制台顺序打印ABC的三种线程实现
注:部分答案引用网络文章 简答题 1.Spring项目启动后的加载流程 (1)使用spring框架的web项目,在tomcat下,是根据web.xml来启动的.web.xml中负责配置启动spring ...
- spring事务失效情况分析
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113 <!--[if !supportLists]-->一.&l ...
- @Transactional spring事务无效的解决方案
关于@Transactional注解 一般都认为要注意以下三点 1 .在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方法.类定义 ...
- Spring事务失效的 8 大原因,这次可以吊打面试官了!
今天再来一篇<吊打面试官>系列,这次真的要吊打了,哈哈!(看往期吊打系列请在后台回复:吊打,我会陆续更新--) 前几天栈长不是发了一篇文章,里面有一个关于事务失效的问题: 用 Spring ...
- Spring事务深入剖析--spring事务失效的原因
之前我们讲的分布式事务的调用都是在一个service中的事务方法,去调用另外一个service中的业务方法, 如果在一个sevice中存在两个分布式事务方法,在一个seivice中两个事务方法相互嵌套 ...
- Spring 事务失效
隔离级别 在 TransactionDefinition.java 接口中,定义了"四种"的隔离级别枚举: /** * [Spring 独有]使用后端数据库默认的隔离级别 * * ...
随机推荐
- POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- c++字符串初始化
#include<string> string s1 = "abcdefg"; string s2("abcdefg");
- Hibernate的属性配置
Hibernate配置属性 hibernate.dialect Hibernate方言(Dialect)的类名 - 可以让Hibernate使用某些特定的数据库平台的特性 取值. full.class ...
- js和.net操作Cookie遇到的问题
Cookie初探1.我理解中的Cookie1.1.Cookie存储位置是客户端的1.2.Cookie存储数据,数据大小也是有限制的 2.Cookie的用法2.1.js对Cookie的操作(网上很多我就 ...
- 【洛谷P3388】(模板)割点
[模板]割点 割点集合:一个顶点集合V,删除该集合的所有定点以及与这些顶点相连的边后,原图不连通,就称集合V为割点集合 点连通度:最小割点集合中的顶点数 边连通度:最小割边集合中的边数 割点:割点集合 ...
- Java并发程序基础
Thread.stop() 直接终止线程,并且会立即释放这个线程所持有的锁. Thread.interrupt() 并不会是线程立即退出,而是给线程发送一个通知,告知目标线程,有人希望你退出啦,至于目 ...
- Android学习笔记_42_各种图形的炫酷效果的实现和使用
一.文档位置: 这里在android中的图形,在帮助文档的这个页面, android-sdk-windows\docs\guide\topics\resources\drawable-resourc ...
- git快捷命令缩写
# Query/use custom command for `git`. zstyle -s ":vcs_info:git:*:-all-" "command" ...
- 用JS实现一个时钟的效果
(效果图) 分两步进行的. 第一步: 要得到现在的 时 分 秒 但是这里面有一个小玄机 . 比如现在是 9点整 时针指向 9 是没错的 但是如果现在是 9点半 时针应该指向的是 9到1 ...
- Java基础知识(持续更新中...)
1.成员变量:全局变量/字段(Field),不要称之为属性(错误)直接定义在类中,方法外面 1.类成员变量 使用static修饰的变量 2.实例成员变量 没用使用static修饰的变量 局部变量 ...