事务的ACID特性
原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。
一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。在事务开始前后,数据库的完整性约束没有被破坏。例如违反了唯一性,必须撤销事务,返回初始状态。
隔离性(isolation):每个读写事务的对象对其他事务的操作对象能相互分离,即:事务提交前对其他事务是不可见的,通常内部加锁实现。
持久性(durability):一旦事务提交,则其所做的修改会永久保存到数据库。
spring中事务的属性
传播行为:
1.PROPAGATION_REQUIRED
支持当前事务;如果不存在,创建一个新的。这通常是事务定义的默认设置,通常定义事务同步作用域。
2.PROPAGATION_SUPPORTS
支持当前事务;如果不存在事务,则以非事务方式执行。
3.PROPAGATION_REQUIRES_NEW
创建一个新事务,如果存在当前事务,则挂起当前事务。
4.PROPAGATION_MANDATORY
支持当前事务;如果当前事务不存在,抛出异常。
5.PROPAGATION_NEVER
不支持当前事务;如果当前事务存在,抛出异常。
6:PROPAGATION_NOT_SUPPORTED
不支持当前事务,存在事务挂起当前事务;始终以非事务方式执行。
7.PROPAGATION_NESTED
如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,类似PROPAGATION_REQUIRED(创建一个新的)。
隔离级别
1.Read Uncommitted(读取未提交内容):可能读取其它事务未提交的数据。----脏读问题,不可重复读
2:Read Committed(读取提交内容):一个事务只能看见已经提交事务所做的改变。----不可重复读,幻读
3:Repeatable Read(可重读):同一事务内多次一致性非锁定读,取第一次读取时建立的快照版本(MVCC),保证了同一事务内部的可重复读。
4:Serializable(串行化):这是最高的隔离级别,它是在每个读的数据行上加上共享锁(LOCK IN SHARE
MODE)。在这个级别,可能导致大量的超时现象和锁竞争。
.
不可重复读和幻读的区别:
不可重复读:(读取数据本身的对比)一个事务在读取某些数据后的一段时间后,再次读取这个数据,发现其读取出来的数据内容已经发生了改变,就是不可重复读。
幻读:(读取结果集条数的对比)一个事务按相同的查询条件查询之前检索过的数据,确发现检索出来的结果集条数变多或者减少(由其他事务插入、删除的),类似产生幻觉。
回滚机制(rollbackfor)
是否只读(readonly)
超时时间(timeout)
spring中事务失效的场景
1:数据库层面,数据库的引擎本身不支持事务
2:被@Transactional注解的方法所在的类没有被spring管理
3:被@Transactional注解的方法所在的类不是public的
4:自身调用的时候,调该类自己的方法,而没有经过 Spring 的代理类,默认只有在外部调用事务才会生效。
因为被spring管理的时候spring内部aop创建的代理对象会把事务的自动提交机制关闭,然后开启事务。
@Service public class OrderServiceImpl implements OrderService {
@Transactional public void update(Order order) { updateOrder(order); }
@Transactional(propagation = Propagation.REQUIRES_NEW) public void
updateOrder(Order order) { // update order } }
5:数据源没有配置事务管理器
6:没有配置回滚的异常类型,默认是RuntimeException,发生的异常不属于这个类。