天天看点

spring笔记-事务基础

2018-1-5 by Atlas

事务是一组逻辑连续的操作,这些操作组合成一个完整的、逻辑的操作。
原子性(atomicity): 事务是原子操作,组成事务的所有操作的执行结果,要么都成功,要么都不成功,不可能部分成功部分不成功。 一致性(consistency): 事务执行前后,完整性约束没有被破坏,包括数据完整、逻辑完整。 隔离性(isolation): 并发的事务执行互不干扰,这些事务并发执行结果和它们先后单独执行结果一样。 持久性(durability): 事务执行完成,事务执行的所有操作结果都会被持久化。
之所以进行事务隔离,是因为事务并发可能产生问题: 脏读(dirty read): 一个事务执行过程中读取到了其他事务没有提交随后撤销的中间状态数据,并发的事务操作后可能对并发访问的数据造成完整性约束的破坏。 不可重复读(non-repeatable read): 一个事务执行过程中读取到了其他事务已经提交的数据,这个事务多次访问的数据发生内容更新,可能影响事务逻辑的完整性约束。 幻读(phantom read): 一个事务执行过程中读取到了其他事务已经提交的数据,这个事务多次访问的数据发生数量更新,可能影响事务逻辑的完整性约束。 事务隔离是手段,隔离级别: read uncommitted: 存在发生脏读、不可重复读、幻读的情况。 read committed: 解决了脏读,存在发生不可重复读、幻读的情况。 repeatable read: 解决了脏读、不可重复读,存在发生幻读的情况。 serializable: 事务串行,不存在事务并发导致的脏读、不可重复读、幻读问题。 理论上世间万物相生相克,不同隔离级别的实现解决问题的程度不同,自然耗费的时间、空间资源也不同,按需选择。
方法即行为,事务传播行为即授予方法何种事务行为。 PROPAGATION_REQUIRED 执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,新建一个事务并执行。 PROPAGATION_SUPPORTS 执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,以非事务的方式执行。 PROPAGATION_MANDATORY 执行到当前方法,如果存在事务,则作为当前事务的操作执行;否则,抛出异常。 PROPAGATION_REQUIRES_NEW 执行到当前方法,如果存在事务,则挂起当前事务,然后新建一个事务并执行,新建的事务和挂起的事务不存在提交等待和失败回滚依赖,相互独立;否则,新建一个事务并执行。 PROPAGATION_NOT_SUPPORTED 执行到当前方法,如果存在事务,则挂起当前事务,然后以非事务的方式执行;否则,以非事务的方式执行。 PROPAGATION_NEVER 执行到当前方法,如果存在事务,则抛出异常;否则,以非事务的方式执行。 PROPAGATION_NESTED 类似 PROPAGATION_REQUIRES_NEW ,区别是新建的事务和挂起的事务存在提交等待和失败回滚依赖,共进退。
上一篇: Spring框架