数据库数据脏读幻读不可重复度的解决

事务的隔离级别

要想解决数据的的脏读幻读和不可重复读,首先要了解事务的隔离级别

事务的原则

一致性
隔离性
持久性
原子性

一致性

当执行失败,所有的修改都会恢复到修改之前的状态。

隔离性

在对修改的数据提交之前,对其他事务不可见。

持久性

通俗的讲就是保存到数据库永久存储(感觉是滴)。

原子性

任何执行过程中的失败,都将导致操作的失败。

数据库的读取问题

脏读:读取到尚未提交的数据。
不可重复读:前后多次读取,数据内容不一致。
幻读:前后多次读取数据总量不一致。

这里的幻读和不可重复度有点不好理解,具体的区别是:
对应不同的操作:
不可重复度:insert update
幻读:insert delete

解决方案

脏读:------修改时加排他锁 读取时加共享锁
不可重复度:------读取时加共享锁 写数据时加排他锁
幻读:------范围锁------锁定检索范围为只读
在这里插入图片描述事务传播行为
在这里插入图片描述

  • PROPAGATION_REQUIRED(必须有事务,这是默认值)

如果存在一个事务,则加入到当前事务。如果没有事务则开启一个新的事务。

  • PROPAGATION_REQUIRES_NEW(必须有新的)

总是开启一个新的事务。如果存在一个事务,则将这个存在的事务挂起,再来一个新的。

  • PROPAGATION_SUPPORTS(支持有事务)

如果存在一个事务,则加入到当前事务。如果没有事务则非事务运行。

  • PROPAGATION_NOT_SUPPORTED(不支持有事务)

总是非事务地执行,并挂起任何存在的事务。

  • PROPAGATION_MANDATORY(强制有事务,自己还不负责创建)

如果存在一个事务,则加入到当前事务。如果没有事务,则抛出异常。

  • PROPAGATION_NEVER(强制不要事务,自己还不负责挂起):

总是非事务地执行,如果存在一个活动事务,则抛出异常。

  • PROPAGATION_NESTED(嵌套事务)

如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务, 则开启一个新的事
务。
内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。
而内层事务操作失败并不会引起外层事务的回滚。
只读事务

  • isReadOnly:配置事务是否是只读事务
  • 事务超时

TIMEOUT_DEFAULT 事务的超时时间,需要底层数据库支持才能使用此配置,-1代表无限制。
事务传播行为指的就是当一个业务方法【被】 另一个业务方法调用时,应该如何进行事务控制。
总结:Spring中的事务控制主要就是通过这三个API实现的
PlatformTransactionManager 负责事务的管理,他是个接口,其子类负责具体工作
TransactionDefinition 定义了事务的一些相关参数
TransactionStatus 代表事务运行的一个实时状态
可以简单的理解三者的关系:事务管理器通过读取事务定义参数进行事务管理,然后会产生一系列的事务状态

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值