数据库事务

什么是事务

事务是访问数据库的一个操作序列,是满足 ACID 特性的一组操作,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。

事务的ACID

A:原子性
原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

B:一致性
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
这些约束可能包括主键约束、外键约束或是一些用户自定义约束。事务执行的前后都是合法的数据状态,不会违背任何的数据完整性,这就是“一致”的意思。
数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对一个数据的读取结果都是相同的。

当然这个含义中也隐含着对开发者的要求,就是不能写出错误的事务逻辑,比如银行的转账不能只加钱不减钱,这是应用层面的一致性要求

C:隔离性性
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果

D:持久性
意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。即使系统发生崩溃,事务执行的结果也不能丢失

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。
主要有四种问题,解决难度依此提升

丢失修改
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。

读脏数据
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

在这里插入图片描述

不可重复读
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

在这里插入图片描述
幻影读
T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
在这里插入图片描述
幻影读和不可重复读的区别
对于前者, 只需要锁住满足条件的记录
对于后者, 要锁住满足条件及其相近的记录
简单的解决方式:避免不可重复读需要锁行就行,避免幻影读则需要锁表
但不可重复读重点在于update和delete,而幻读的重点在于insert
所以说不可重复读和幻读最大的区别,就在于如何通过锁机制来解决他们产生的问题

产生并发不一致性问题主要原因是破坏了事务的隔离性,解决方法是通过并发控制来保证隔离性。并发控制可以通过封锁来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别,让用户以一种更轻松的方式处理并发一致性问题。
参考:https://blog.csdn.net/qq_39521554/article/details/80240841

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值