@Transactional注解默认值
String value() default "";
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
boolean readOnly() default false;
只读事务是否做无用功?
https://blog.csdn.net/yulin_ganbo/article/details/78566835
注意事项:
1、@Transactional只能被应用到public方法上,对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能
2、如果是本类加了事务的方法,调用本类另一个加了@Transactional标签的方法,事务也不会生效,因为切面是由代理类实现,代理类调用本类方法,是用this.xxx切面切不进去
3、哪些地方需要加事务:
只有查询的方法可以不加事务
只有一句增删改sql的方法,考虑数据库操作后面会不会抛异常,抛异常了要不要回滚
4、要想事务回滚你的异常要么派生自RuntimeException或者Error,或者在注解中用rollbackFor指定
事务的使用
1、A方法上加了@Transactional注解
//没有事务
A();
//没有事务
如果A方法前后都没有事务,那么A方法调用完后,事务就会提交
2、A、B方法上加了@Transactional注解
//没有事务
A();
B();
//没有事务
A方法执行完,事务提交。B方法执行完,事务提交。A和B是各自独立的事务。
3、A、B方法上加了@Transactional注解
//没有事务
A() {
B();
}
//没有事务
A方法调用B方法,B方法可以加入A方法开启的事务,或者单独新建一个事务(根据事务传递性配置)
4、在一个事务中,要操作多张表时,需要考虑一张表操作成功,另一张表操作失败的情况
如果在外层捕获了异常,事务不会回滚,那么就会造成,一张表有记录,一张表没记录的情况