事务四大特性、事务隔离级别通俗理解

目录

事务具有的特性 ACID

原子性和一致性的理解(例子)

(侵删)

并发事务带来的问题

封锁

# 封锁粒度

# 封锁类型

事务隔离级别有哪些?


事务具有的特性 ACID

原子性 atomicity 这几条语句 构成一个事务 是一个最小的执行单元 要么都执行 要么都不执行

回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可

一致性 consistency执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

隔离性 isolation我在读数据的过程中 别人不能读 事务的操作彼此独立 互斥

持久性 durability 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 持续性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变是永久性的。

系统发生崩溃可以用重做日志(Redo Log)进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改

事务的 ACID 特性概念简单,但不是很好理解,主要是因为这几个特性不是一种平级关系:

  • 只有满足一致性,事务的执行结果才是正确的。
  • 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。
  • 在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。
  • 事务满足持久化是为了能应对系统崩溃的情况。

原子性和一致性的理解(例子)

原子性: 银行转账,我给你赚 我数据库中的金额减少 你的增多,两个操作要么都执行 要么都不执行

一致性: 假如在第一步执行完之后服务器宕机了,那么显然第二步将无法完成,我的建设银行卡被扣了1000,但中国银行的卡却没增加,这个时候就发生了“不守恒”,我将白白损失了1000块钱。在数据库中,这就是所谓的“不一致性状态”。

可是自然界中是应该要保持“守恒”的,我们用计算机模拟现实世界也应该做到这一点,所以前人才提出了“一致性”的概念,使得计算机世界与现实世界更加贴近。那么如何实现“一致性”呢?

事实上,ACID中的AID都是为了实现C的。事务的最终目的就是为了实现“一致性”。如果转账的操作具有原子性,那么在中途出现错误的时候发生回滚,就不会出现不一致的情况,可见,“原子性”和“一致性”是紧密联系在一起的!

(侵删)

并发事务带来的问题

假如多个客户端同时对数据库进行操作,就会带来以下问题;

前提: 两个以上事务想要对数据库进行读写(必须有写操作,只有读是不会出现并发问题的)

脏读 读了脏数据 我修改但是还没有提交的时候 你也读了 这时候你读的就是没有提交的数据 也就是过时的数据

丢失修改( Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。

例如:事务1读取某表中的数据A=20, 事务2也读取A=20, 事务1修改A=A-10, 事务2也修改A=A-10, 最终结果A=10,事务1的修改被丢失。

不可重复读( Unrepeatableread):指在一个事务内多次读同一数据。但是有另外一个事务 在中途修改了这个数据 就会造成 读取的两次数据不一致,导致读操作失误了,

幻读( Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的査询中,第个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。

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

封锁

封锁粒度

MySQL 中提供了两种封锁粒度:行级锁以及表级锁。

应该尽量只锁定需要修改的那部分数据,而不是所有的资源。锁定的数据量越少,发生锁争用的可能就越小,系统的并发程度就越高。

但是加锁需要消耗资源,锁的各种操作(包括获取锁、释放锁、以及检查锁状态)都会增加系统开销。因此封锁粒度越小,系统开销就越大。

在选择封锁粒度时,需要在锁开销和并发程度之间做一个权衡。

封锁粒度小,锁开销大,并发程度大。

封锁类型

# 1. 读写锁

  • 互斥锁(Exclusive),简写为 X 锁,又称写锁。
  • 共享锁(Shared),简写为 S 锁,又称读锁。

有以下两个规定:

  • 一个事务对数据对象 A 加了 X 锁,就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁。
  • 一个事务对数据对象 A 加了 S 锁,可以对 A 进行读取操作,但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁,但是不能加 X 锁。

数据库系统原理 | CS-Notes

事务隔离级别有哪些?

如何解决上述问题呢?

SQL标准定义了四个隔离级别:

READ- UNCOMIMIIMTED(读取未提交)

最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读 读取未提交 就代表着允许 别人和你同时操作一块数据 相当于没有隔离

READ-COMIMIWMLED(读取已提交)

允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生 这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

你第一次读取 不会有脏读 但是不能保证 第二次读取之前 别的事务修改数据 或者 增删数据

REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

SERIALIZABLE (可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有 的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可 以防止脏读、不可重复读以及幻读。在这个级别,可能导致大量的超时现象和锁竞争。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值