什么是事务?
数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作座位一个整体一起向系统提交,要么都执行,要么都不执行事务是一组不可在分割的操作集合
1.1 四种事务特性
事务特性 | 描述 |
---|---|
原子性 | 强调事务不可再分,要么全部成功,要么失败回滚 |
一致性 | 事务执行前后数据完整性保持一致 |
隔离性 | 一个事务执行过程中,不受其他事物影响 |
持久性 | 事务一旦结束,就持久化到数据库 |
1.2 五种事务隔离级别
脏读:还未提交的数据,非数据库存在的数据
不可重复度:数据由于对所有事务可见,导致多次查询期间值可能改变导致查询结果不一致
幻读:一个事务在查询之后,另一个事务提交的新的数据,导致上一个事务无法感知这条数据
事务隔离级别 | 描述 |
---|---|
ISOLATION_DEFAULT | 采用数据库默认的隔离级别 |
ISOLATION_READ_UNCOMMIT | 是事务的最低级别,允许一个事务读取另一个事务未提交的数据,会产生脏读、不可重复读和幻读 |
ISOLATION_READ_COMMIT | 事务只会读取已提交的数据,但是会产生不可重复读和幻读 |
ISOLATION_REPEATABLE_READ | 确保事务可以多次从一个字段中读取相同的值,在事务执行期间,禁止其他事务对该字段进行修改,会产生幻读 |
ISOLATION_SERIALIZABLE | 效率最低但最可靠的事务级别,保证事务按顺序执行 |
1.3 七种事务的传播行为
事务传播行为类型 | 说明 |
---|---|
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
1.4 REQUIRED、NESTED、REQUIRED_NEW的区别
NESTED 和 REQUIRED 修饰的内部方法都属于外围方法事务,如果外围方法抛出异常,这两种方法的事务都会被回滚。但是 REQUIRED 是加入外围方法事务,所以和外围事务同属于一个事务,一旦 REQUIRED 事务抛出异常被回滚,外围方法事务也将被回滚。而 NESTED 是外围方法的子事务,有单独的保存点,所以 NESTED 方法抛出异常被回滚,不会影响到外围方法的事务。
NESTED 和 REQUIRES_NEW 都可以做到内部方法事务回滚而不影响外围方法事务。但是因为 NESTED 是嵌套事务,所以外围方法回滚之后,作为外围方法事务的子事务也会被回滚。而 REQUIRES_NEW 是通过开启新的事务实现的,内部事务和外围事务是两个事务,外围事务回滚不会影响内部事务。