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)介绍我们常见的隔离在事务中的作用
常见的事务事故:
脏读
两个独立事务,一个事务两次查询,一个事务修改/删除数据,但是未提交,这种造成查询结果不一致的情况叫,脏读,即读到了其他事务未提交的数据,我们通常把数据库操作数据,数据存在于内存当时还未持久化的数据叫做脏数据。因此这种情况也就叫脏读。
MySQL——事务与锁
不可重复读
两个独立事务,一个事务两次查询,一个事务修改/删除数据,并提交,导致读取数据不一致的情况叫做不可重复读。
MySQL——事务与锁
幻读、虚读
与不可重复读的差异是一个事务在插入数据,导致查询不一致。
MySQL——事务与锁
因此为避免这些情况的发送我们引入隔离级别的概念。
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 ,回滚指针,其实就是记录删除的事务版本号。
MySQL——事务与锁
我们简单介绍一下原理:
MySQL——事务与锁
规则:查询创建时间小于等于当前事务id的数据,和删除时间大于当前事务id的行。
我们其实这些被修改的数据或者删除的数据,其实是存在于undolog日志文件中的,并不是在表中显示的。
我自己理解,其实MySQL的许多数据的变化都会存入到其日志文件中,如cannal实现的就是监控其二进制文件,从而达到数据监控以及同步。
6、事务与锁
内容后续更新