MySQL——事务与锁详解

事务与锁详解

1.事务的定义

一系列的数据库操作,这些操作必须全部执行,否则全部不执行。例如一些和银行账户存取相关的数据库操作,必须得保证每一个操作得执行。

2.事务冲突——赃读、不可重复读、幻读

由于为了加快数据库的操作,需要数据库支持并发,这样就可能会产生多个事务同时操作同一张表,这样就可能产生一些冲突。如下:

  1. 赃读
    事务A读取的是事务B修改之后的数据,若事务B最后由于某些操作没完成,导致事务回滚,造成A读取了错误的数据。 关键词:读后回滚、事务回滚
  2. 不可重复读
    事务B对事务A已经读取的数据进行了修改,这样如果事务A再次重新读取数据的话就会造成数据不一致。关键词:读后修改、update、delete
  3. 幻读
    事务B对事务A搜索条件以外的数据进行了修改或增加,造成事务A再次重新读取数据的时候,发现多了几行满足条件的数据。关键词:非读取数据修改、再次读取行数增加、insert

既然存在这些冲突,于是下面引出事务的隔离级别概念,他们就是用来解决这些冲突的方案。

3.事务的隔离级别

  1. Read Uncommitted(未提交读)
    事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻读”和“不可重复读取”。
  2. Read Commited (提交读)
    大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据。其实质上是对进行修改但未提交的的数据加了锁,这样就避免了事务回滚带来的赃读可能
    但不能避免“幻读”和“不可重复读取”,因为该级别只是对修改操作的数据加了锁,并未对读取操作的数据加锁。不能避免其他事务对这些已读取的数据进行修改
  3. Repeatable Read(重复读)
    保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。其实质上,就是对已读取但未提交的数据加了锁,这样就避免了其他事务对这些数据进行修改,避免了“脏读取”和“不可重复读取”的情况。
    但不能避免“幻读”,因为幻读是对非读取的数据进行操作,而这一级别的隔离是对已读取和已操作的数据进行限制。MySQL默认事务隔离级别
  4. Serializable (串行化)
    最严格的级别,事务串行执行,资源消耗最大。最严格的级别,事务串行执行,资源消耗最大。每一个事务进行操作时,都对表进行加锁,不允许其他事务进行操作。

4.MVCC(多版本并发控制)

后来为了解决幻读,引入了MVCC(多版本并发控制)机制。下面简单介绍一下:
其实质上是通过对表增加一个版本字段来实现的。比如INnoDB中的实现机制,它通过对每个表增添版本起始字段(创建时的版本号删除时的版本号)来进行版本控制。每开始一个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号。

InnoDB会根据以下两个条件检查每行记录:

  1. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
  2. 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。

5.锁的概念

从上面事务的相关概念,可以发现,要想实现事务的隔离级别,也可以说是为了解决并发冲突,我们必须得依靠锁。锁是一种实现事务隔离级别和并发的一种机制。
根据处理策略的不同,在不同的角度便有不同的锁分类:

  1. 功能:共享锁(读锁)、排它锁(写锁)
  2. 粒度:表锁、行锁
  3. 时间:
    乐观锁(提交前):假定不发生并发冲突,只在提交时检查是否违反数据完整性
    悲观锁(事务开始后):假定会发生并发冲突,屏蔽一切可能违法数据完整性的操作

我们可以发现MVCC实际上就是一种乐观锁机制,它就是在提交前检查版本号是否满足条件。但并不是任何场景都适合乐观锁机制
比如update、insert、delete非常频繁的场景下,乐观锁机制就不适合,因为这样会造成大量的事务回滚操作,大量浪费时间。
相反在查询操作比例大于增删改操作时,就适合用乐观锁机制。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值