Spring事务

什么是事务?

是数据库操作的最小工作但愿,是作为单个逻辑敢做单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行,事务时一组不可再分割的操作集合(工作逻辑单元)

通俗的讲就是,为了达到某个目的而做的一系列操作要么一起成功,要么一起失败

最常见的案例:
小明给小花转账:

开启事务-----------
1.小明账户扣除1000元
2.小花的账户增加1000元
事务提交-----------
上面的任何步骤一旦出现问题,都会导致事务回滚。

事务的四大特性(一原持久隔离)

1.原子性:事务中所有操作是不可再分割的原子单元。事务中所有操作要么全部成功,要么全部失败。
2.一致性:事务执行成功后,数据库状态是与其他业务规则保持一致。如转账业务,无论事务执行成功与否,参数转账的两个账号余额应该是不变的。
3.持久性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
4.隔离性:一旦事务提交之后事务中所有数据都必须被提交到数据库中,即使提交事务后,数据库马上崩溃,在重启数据库时,也必须能保证通过某种机制恢复数据。

原生的JDBC操作

数据库中的事务隔离级别

数据库中的事务的隔离级别有四种,由低到高
Read uncommited:读取未提交,就是一个事务可以读取另一个提交事务的数据,会产生脏读
read commited:读取已提交,一个事务要等另一个事务提交后才能读取数据,会产生不可重复读。
Repeatable read:重复读,就是在开始读取数据时,不再允许修改操作,可能会产生幻读
Serializable:这是事务隔离的最高级别,在该级别下,事务串行化顺序执行,可以避免脏读,不可重复读与幻读。但是这种事务隔离级别效率低下,比较消耗数据库的性能,一般不使用。
针对以上的隔离级别可能会出现四种错误:
脏读:读取了未提交的新事务,然后被回滚了。
demo:事务A读取了事务B未提交的数据。如果事务B回滚了,则A读取使用了事务B的错误的数据。

不可重复读:读取了提交的新事务 ,指更新操作。
demo:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。

幻读:读取了提交的新事务 ,指增删操作
demo:在事务A多次读取构成中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。

不可重复读与幻读的区分:不可重复读是因为修改了导致数据读取不一致 ,幻读是因为新增或者修改导致两次数据读取不一致。
事务丢失:
第一类事务丢失:回滚丢失
对于第一类事务丢失,就是比如A和B同时在执行一个数据,然后B事务已经提交了,然后A事务回滚了(到未开始事务的状态),这样B的事务操作因为A事务回滚而丢失了。

第二类事务丢失:提交覆盖丢失
对于第二类事务丢失,也称为覆盖丢失,就是A和B一起执行一个数据,两个同时取到一个数据,然后B事务首先提交,但是A事务加下来又提交了,这样就覆盖了B事务。

大多数数据库默认的事务隔离级别是:read commited,比如sql Server。oracle
mysql的默认隔离级别是:Repeatable read

spring中的事务的传播特性

什么事传播特性?
指的是当前一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。

传播行为 描述
PROPAGATION_REQUIRED 如果没有,就开启一个事务;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)
RROPAGATION_REQUIRES_NEW 如果没有,就开启一个事务;如果有,就将当前事务挂起。(方法A所在的事务就会挂起,方法B会起一个新的事务,等待方法B的事务完成以后,方法A才继续执行)
PROPAGATION_NESTED 如果没有,就开启一个事务;如果有,就在当前事务中嵌套其他事务
PROPAGATION_SUPPORTS 如果没有,就以非事务方式执行;如果有,就加入当前事务(方法B看到自己已经运行在 方法A的事务内部,就不再起新的事务,直接加入方法A)
PROPAGATION_NOT_SUPPORTED 如果没有,就以非事务方式执行;如果有,就将当前事务挂起,(方法A所在的事务就会挂起,而方法B以非事务的状态运行完,再继续方法A的事务)
PROPAGATION_NEVER 如果没有,就以非事务方式执行;如果有,就抛出异常。
PROPAGATION_MANDATORY 如果没有,就抛出异常;如果有,就使用当前事务

总结:
死活不要事务:
PROPAGATION_NEVER
PROPAGATION_NOT_SUPPORTED
可有可无:
PROPAGATION_SUPPORTS
必须有一个事务:
PROPAGATION_REQUIRED
RROPAGATION_REQUIRES_NEW
PROPAGATION_NESTED
PROPAGATION_MANDATORY

posted @ 2022-04-08 09:05  King-DA  阅读(39)  评论(0)    收藏  举报