MySQL 数据库事务及隔离级别,多版本控制

事务:

事务就是一组原子性的SQL操作,事务内的语句要求全部执行成功,否则全部执行失败。

四大特性:

A:原子性,一个事务是不可分割的最小工作单元,不可能只执行其中的一部分操作。
B:一致性,数据必须确保从一个一致性状态转换到另一个一致性状态。
C:隔离性,一个事务所做的修改在提交前,对其他事务不可见。
D:持久性,一旦事务提交,数据结果会永久保存到数据库中。

隔离级别:

A:read uncommited,

顾名思义就是事务中sql操作,即使没有提交,对其他事务也是可见的。
例如:有张数据表t_sb(id,name),事务1在表中插入一条数据,还未提交,事务2在查询时,便查到了这条数据,这就是脏读。

B:read committed,

一个事务只能看到其他事务提交后的修改,即事务在提交之前,对其他事务不可见。
例如:事务1在表中插入一条数据,并提交了,事务2中是可以查询到的,这是合理的,因为事务1已经提交。但是,如果事务3对此条数据进行了修改,事务2再次查询可能会得到不同于之前查询的结果,因为两次查询结果不一致,导致不可重复读。

C:repeatable read,

可重复读,保证了一个事务中多次读取同样的记录结果是一致的,mysql的默认隔离级别,可以通过var查看。

show variables like '%ISOLATION%'; 

例如:事务1开始查询某条记录,之后事务2中对目标记录进行了修改并提交,而事务1是看不到事务2的提交的,这就确保事务1中多次查询相同的记录返回的结果是相同的。可以自行测试:

事务1:
set autocommit=off;
start TRANSACTION;
select * from user;
update user t set t.name = '小麦2' where t.id=1; 
commit;
事务2:
update user t set t.name = '小麦' where t.id=1; 

事务1只能看到本事务中数据的修改,事务2中的修改对事务1不可见,这就保证了可重复读。但是,理论上可重复读还是无法解决幻行问题,即按某个范围查询时,可能会有新增或删除的数据,然而mysql使用MVCC解决了这一问题。

D:serializable,

最高的隔离级别,强制事务进行串行执行,读取的每一行数据都会进行上锁,可以说最大限度保证数据的一致性,同时,牺牲了高并发(因为锁竞争及等待),实际应用很少使用。

多版本控制(MVCC)

为了提升并发性能,很多数据库都实现了MVCC,可以简单理解为行级锁的变种,版本控制也可以简化理解为乐观锁和悲观锁。通过在每条记录上增加两个列(版本号),一个是创建版本号,另一个是删除版本号,每开启一个事务,版本号都会自增。

所以就会有以下简化规则:
select:只能查找小于等于当前版本号的行记录,且没有删除版本号或删除版本号大于当前版本号的。
insert:为新插入的每一行保存当前事务的创建版本号。
delete:将删除的每一行保存当前事务的删除版本号。
update:新增一条记录并保存版本号,将原记录更新删除版本号,这也就是修改=新增+删除。

事务的作用

事务的存在就是为了保证数据的准确性及安全性,即你在银行的存款不会因为系统原因而丢失。

猜你喜欢

转载自blog.csdn.net/weixin_43275277/article/details/106963136
今日推荐