事务的传播机制是什么(事务的四种隔离级别和七种传播行为)
事务的传播机制是什么(事务的四种隔离级别和七种传播行为)
要想在Spring中使用事务 就需要先了解事务
1.什么是事务?- 事务(TRANSACTION) 是作为单个逻辑工作单元执行的一系列操作。
- 多个操作作为一个整体向系统提交,要么都执行,要么都不执行。
- 事务是一个不可分割的逻辑单元。
- 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency) 事务前后数据的完整性必须保持一致。
- 隔离性(Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
- 脏读:简单来说 就是一个事务读取到了另一个事务未提交的数据。
- 不可重复读:就是说 比如在A事务中进行多次相同的查询 B事务在A事务多次查询之间修改对应表中的数据 导致A事务多次读取的结果不一致。
- 幻读:举例来说 就是A事务将表中'性别'列的值都更改为1 B事务在A事务修改之后又添加了一条记录 而'性别'的值为0 回过来A再查询所以的记录时会发现有一条记录的'性别'为0 这种情况就是所谓的幻读
- ISOLATION_READ_UNCOMMITTED:读未提交
- ISOLATION_READ_COMMITTED:读已提交
- ISOLATION_REPEATABLE_READ:可重复读
- ISOLATION_SERIALIZABLE:串行化
什么是事务的传播行为:事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
- PROPAGATION_REQUIRED 表示当前方法必须在一个具有事务的 上下文中运行 如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。( 如果被调用端发生异常 那么调用端和被调用端事务都将回滚)
- PROPAGATION_SUPPORTS 表示当前方法不必需要具有一个事务 上下文 但是如果有一个事务的话 它也可以在这个事务中运行
- PROPAGATION_MANDATORY 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常
- PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
- PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。
- PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常
- PROPAGATION_NESTED表示如果当前方法正有一个事务在运行中 则该方法应该运行在一个嵌套事务中 被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在 并且外层事务抛出异常回滚,那么内层事务必须回滚 反之 内层事务并不影响外层事务。如果封装事务不存在 则同propagation. required的一样