Spring @Transaction学习

[color=red][b]1.考虑有下面这么一个类[/b][/color]

public class Foo {
@Transactional
public void bar() { /* … */ }

public void baz() {
this.bar();
}
}


Spring之所以可以对开启@Transactional的方法进行事务管理,[b][size=medium][color=red]是因为Spring为当前类生成了一个代理类,然后在执行相关方法时,会判断这个方法有没有@Transactional注解,如果有的话,则会开启一个事务。 [/color][/size][/b]
但是,上面这种调用方式时,在调用baz()时,使用的并不是代理对象,从而导致this.bar()时也不是代码对象,从而导致@Transactional失败。

非事务声明方法调用事务声明方法,则事务失效。使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。[size=medium][color=red][b]比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)[/b][/color][/size]

[size=medium][color=red][b]2.rollbackFor属性[/b][/color][/size]

默认情况下,在遇到运行时异常和Error,Spring事务会进行回滚,而遇到非运行时异常Exception则不会回滚
可以通过rollbackFor指定需要回滚的受检查异常,[color=red][b]指定异常之后rollbackFor=Exception.class,被指定的异常和该异常的子类都会得到回滚,并且运行时异常和Error异常仍然会得到回滚。[/b][/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值