一、@Transactional
注意事项:如果动态代理使用的是jdk默认的动态代理,那么进行@Resource注入的时候,一定要给接口注入对象,而不是给实现类注入对象。因为aop底层是基于业务层接口通过反射构造实现类对业务方法进行执行的。所以必须注入接口。不然会报BeanNotRequiredException。
二、事务的管理
@Transactional(readonly=true),在业务方法上添加该注解
“只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。
三、事务的传播
事务的传播:业务重构的时候需要业务方法调用业务方法,这就需要一个业务方法的事务传播到另一个业务方法中,整合为一个事务。
举例就是——一个业务方法内调用了其他的业务方法,也就是说一个业务是由多个事务(或者业务)组成并合成一个事务的。这时候我们为了保持事务的原子性与一致性,要在这多个业务方法上增加@Transactional注解。就可以保持事务的原子性与一致性。一旦这个业务中的某个业务发生了异常,那么所有事务都不会commi
四、事务传播(propagation)属性
重点掌握 Propagation.REQUIRED
- @Transactional(propagation=Propagation.REQUIRED)
- 需要事务, 如果没有事务创建新事务, 如果当前有事务参与当前事务
- @Transactional(propagation=Propagation.MANDATORY)
- 必须有事务, 如果当前没有事务就抛异常
- @Transactional(propagation=Propagation.NEVER)
- 绝不, 绝对不能有事务, 如果在事务中调用则抛出异常
- 在业务方法上打此标签,事务是具有原子性,但是事务不参与传播,一旦在别的业务方法中调用此业务方法,则会抛出异常
- @Transactional(propagation=Propagation.NESTED)
- 嵌套, 必须被嵌套到其他事务中
- @Transactional(propagation=Propagation.NOT_SUPPORTED)
- 不支持事务
- @Transactional(propagation=Propagation.SUPPORTS)
- 支持事务, 如果没有事务也不会创建新事务
- @Transactional(propagation=Propagation.REQUIRES_NEW)
- 必须是新事务, 如果有当前事务, 挂起当前事务并且开启新事务.