事务
-
什么是事务
事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败,不可能存在部分成功的情况;事务是一个最小的不可再分割的工作单元,通常来说一个事务对应一个完整的业务;只有对数据库进行操作时(DML)才会有事务(不包括查询select)。
-
事务的四大特性(简称‘ACID’)
*原子性(Atomicity) 事务中所有操作是不可再分割的原子单位。一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做。 *一致性(Consistency) 事务执行后,数据库状态与其他业务规则保持一致(即在事务处理执行前后,数据库是一致的)。 *隔离性(Isolation) 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相干扰,即一个事务处理对另一个事务处理没有影响。 *持久性(Durability) 一旦事务提交成功,事务中所有的数据库操作都必须被持久化到DB中,即便系统遇到故障的情况下,数据也不会丢失。【内存中的数据持久到硬盘文件中】
-
Spring事务的七种传播行为:
由@Transaction(Propagation=XXX)设置决定: 事务传播行为类型: 说明: PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这 是最常见的选择。 PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。 PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED类似的操作。
-
事务的隔离级别
第一级别:读未提交 read uncommitted - 事务A和事务B,事务A未提交的数据,事务B可以读取到。 - 这里读取到的数据可以叫做“脏数据”或者叫做“Dirty Read”。 - 这种隔离级别是最低级别,这种级别一般都是理论上存在的,数据库默认的隔离级别一般都是高于该隔离级别的。 第二级别:读已提交 read committed