MySQL——事务与锁

1、简要
此文章主要是以MySQL5.7版本为例,介绍事务与锁。
2、事务概念
事务是数据库管理系统(DBMS)执行过程的一个最小执行单位,由一个有限的数据库操作序列构成。
3、事务的隔离级别
原子性:特指操作的原子性,原子特指最小的单位,即要么全成功,要么全失败。
一致性:这里的一致性特指整体性,即两个账号的加减钱数,作为一个整体。不能多增或者多减。
隔离性:隔离性特指我们操作sql时,不能互相干扰,我们的隔离是有隔离级别之分的,即隔离的力度是不一致的。
持久性:我们一旦提交完数据后,会将其持久化到数据库中,即一旦提交,就不能发生改变了。
4、事务讲解
(1)在我们MySQL中有多种存储引擎的,m’yISAM、InnoDB、nDB、Memory等等,其中支持事务的为InnoDB、nDB。MySQL5.7默认引擎为innoDB。
其中针对sql的DML语句我们默认是开启事务的 ,可以采用show variables like autocommit 来查看我们事务情况。
(2)这里简单说下,
我们开启事务的方式:
begin、start transcation 两种方式,第二种可以配合参数使用,更加灵活。
提交事务:
commit
回滚事务:
rollback ,关闭连接。
(3)介绍我们常见的隔离在事务中的作用
常见的事务事故:
脏读
两个独立事务,一个事务两次查询,一个事务修改/删除数据,但是未提交,这种造成查询结果不一致的情况叫,脏读,即读到了其他事务未提交的数据,我们通常把数据库操作数据,数据存在于内存当时还未持久化的数据叫做脏数据。因此这种情况也就叫脏读。
在这里插入图片描述
不可重复读
两个独立事务,一个事务两次查询,一个事务修改/删除数据,并提交,导致读取数据不一致的情况叫做不可重复读。
在这里插入图片描述
幻读、虚读
与不可重复读的差异是一个事务在插入数据,导致查询不一致。
在这里插入图片描述
因此为避免这些情况的发送我们引入隔离级别的概念。
5、隔离级别
其中p1、p2、p3 分别代表 脏读、不可重复读、幻读
p1 p2 p3
Read Uncommited 未提交读 可能 可能 可能
Read Commited 读已提交 不可能 可能 可能
Repeatable Read 可重复读 不可能 不可能 innoDb不可能
Serilizable 串行化 不可能 不可能 不可能
其实解决这些问题我们可能会想起两种方式:
(1)给数据库加锁,防止我在操作时你进行修改
(2)在同一个事物操作时,首先对数据进行备份,即形成一个快照,目的防止我们的数据中途遭到篡改,导致我们使用数据进行操作时,导致的不一致情况。
我们先来介绍一下第二种方式,锁我们在后面说明:
我们的数据建表时,其实不光只有我们创建的字段,其实还有一些隐藏字段,例如
DB_ROW_ID 当我们没有主键时,他会替我们生成,有主键则为主键。
DB_TRX_ID ,这个我们可以简单理解为事务ID,即事务的版本号。
DB_ROLL_PTR ,回滚指针,其实就是记录删除的事务版本号。
在这里插入图片描述
我们简单介绍一下原理:
在这里插入图片描述
规则:查询创建时间小于等于当前事务id的数据,和删除时间大于当前事务id的行。
我们其实这些被修改的数据或者删除的数据,其实是存在于undolog日志文件中的,并不是在表中显示的。
我自己理解,其实MySQL的许多数据的变化都会存入到其日志文件中,如cannal实现的就是监控其二进制文件,从而达到数据监控以及同步。
6、事务与锁
保障事务的另一种锁的方式,我们这里主要分为表锁和行锁
在这里插入图片描述
我们把锁分为共享锁、排他锁、意向锁、记录锁、间隙锁、临建锁。
共享锁:又称为读锁,即多个事务对同一数据可以实现公用同一把锁,都能访问到数据,但是只能读不能修改。
select * from student where id=1 lock in share mode
释放锁(X锁):commit/rollback
排它锁:排它锁不能与其他锁共存,又称为写锁,我们一旦获取该行数据的排他锁就能够对该行的数据进行修改,
加锁方式:默认update/insert/delect 加X锁
select * from student where id=1 for update (其实当做更新处理)
意向锁:所谓意向锁,我理解的就像是一个flag一样,就是一个标识,标志着这个表中已经存在了一个锁,否则我们给表加锁时就得全表扫描。
记录锁、间隙锁、临建锁,更像是一种算法。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
记录锁更像是一种精准匹配。我们在隔离级别可重复读RR中,为什么innnoDB能够解决幻读,就是因为我们的临建锁,主要是防止插入操作的。
注意:我们上锁是锁的索引,当没有索引时,我们主要采用的row_id这个隐藏字段,这里当我们给唯一索引(辅助索引)上锁时,其实也同样给主键加了锁,因为:从下图中我们可以看出辅助索引终究要找到主键索引去,并找到完整的行数据,辅助索引在Btree中只是记录自己的列和主键。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值