数据库中的事务与spring中的事务的控制

参考的url:https://mp.weixin.qq.com/s/PoSxR_8KNINworwuUlj6-A

 

事务隔离性:
一致性,持久性,原子性,隔离性
一致性:数据不会遭到破坏
持久性:插入数据的时候,将数据保存在磁盘中
原子性:有始有终,不能半途而废
隔离性:当a和b对同一条id数据进行更改的时候,由先开始事务的执行,然后后面的执行。
数据库中的隔离级别:
READ_UNCOMMITTED:读未提交,造成数据的丢失,禁止使用
READ_COMMITTED:读已提交
REPEATABLE_READ:
SERIALIZABLE
隔离性可能会产生的问题:
Dirty Read(脏读):
Unrepeatable Read(不可重复读)
Phantom Read(幻读)

脏读:事务 A 读取了事务 B 未提交的数据,并在这个基础上又做了其他操作。
不可重复读:事务 A 读取了事务 B 已提交的更改数据。
幻读:事务 A 读取了事务 B 已提交的新增数据。

数据库中的事务与spring中的事务的控制_第1张图片

 

spring:事务传播行为(Transaction Propagation Behavior)
PROPAGATION_REQUIRED
RROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED
PROPAGATION_SUPPORTS
PROPAGATION_NOT_SUPPORTED
PROPAGATION_NEVER
PROPAGATION_MANDATORY

解析:
假设事务从方法 A 传播到方法 B,您需要面对方法 B,问自己一个问题:
方法 A 有事务吗?
如果没有,就新建一个事务;如果有,就加入当前事务。这就是 PROPAGATION_REQUIRED,它也是 Spring 提供的默认事务传播行为,适合绝大多数情况。
如果没有,就新建一个事务;如果有,就将当前事务挂起。这就是 RROPAGATION_REQUIRES_NEW,意思就是创建了一个新事务,它和原来的事务没有任何关系了。
如果没有,就新建一个事务;如果有,就在当前事务中嵌套其他事务。这就是 PROPAGATION_NESTED,也就是传说中的“嵌套事务”了,所嵌套的子事务与主事务之间是有关联的(当主事务提交或回滚,子事务也会提交或回滚)。
如果没有,就以非事务方式执行;如果有,就使用当前事务。这就是 PROPAGATION_SUPPORTS,这种方式非常随意,没有就没有,有就有,有点无所谓的态度,反正我是支持你的。
如果没有,就以非事务方式执行;如果有,就将当前事务挂起。这就是 PROPAGATION_NOT_SUPPORTED,这种方式非常强硬,没有就没有,有我也不支持你,把你挂起来,不鸟你。
如果没有,就以非事务方式执行;如果有,就抛出异常。这就是 PROPAGATION_NEVER,这种方式更猛,没有就没有,有了反而报错,确实够牛的,它说:我从不支持事务!
如果没有,就抛出异常;如果有,就使用当前事务。这就是 PROPAGATION_MANDATORY,这种方式可以说是牛逼中的牛逼了,没有事务直接就报错,确实够狠的,它说:我必须要有事务!
Spring中附加的小功能:
事务超时(Transaction Timeout):为了解决事务时间太长,消耗太多的资源,所以故意给事务设置一个最大时常,如果超过了,就回滚事务。
只读事务(Readonly Transaction):为了忽略那些不需要事务的方法,比如读取数据,这样可以有效地提高一些性能。

 推荐使用注解的方式进行事务

 @Transactional(propagation=Propagation.REQUIRES_NEW, isolation=Isolation.READ_COMMITTED,
             noRollbackFor={ArithmeticException.class},timeout=3,readOnly=false)

 数据库中的事务与spring中的事务的控制_第2张图片

你可能感兴趣的:(Study,mysql,javaSSm)