作用:
将⼀组操作封装成⼀个执⾏单元,要么全部成功要么全部失败
特性:
事务有4⼤特性(ACID),原⼦性、持久性、一致性、隔离性
实现原理:
开启事物
提交事物
回滚事物
实现方式:
编程式事物:DataSourceTransactionManager
声明式事物:@Transactional(作用范围包括方法和类)
Spring事物隔离级别
读未提交,产生脏读;
读已提交,产生不可重复读;
可重复读,产生幻读;
序列化
- 脏读:一个事务读取到了另一个事务修改的数据之后,后一个事务又进行了回滚操作,从而导致第一个事务读取的数据是错误的。
- 不可重复读:一个事务两次查询得到的结果不同,因为在两次查询中间,有另一个事务把数据修改了。
- 幻读:一个事务两次查询中得到的结果集不同,因为在两次查询中另一个事务有新增了一部分数据。
事物传播机制
- Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
- Propagation.SUPPORTS:如果当前存在事务,则加入该事务:如果当前没有事务,则以非事务的方式继续运行。
- Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务且开启的事务相互独立,互不干扰。
- Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常,
- Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION REQUIRED
注意:
同类中a()调用b(),即使b()声明了指定事物传播方式,也无效,需要特殊配置:
@EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass = true)