MySQL 数据库事务及隔离级别,多版本控制
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL 数据库事务及隔离级别,多版本控制,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2341字,纯文字阅读大概需要4分钟。
内容图文
![MySQL 数据库事务及隔离级别,多版本控制](/upload/InfoBanner/zyjiaocheng/864/861ccce2f4744c1ab3bd386e58679f1f.jpg)
事务:
事务就是一组原子性的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:新增一条记录并保存版本号,将原记录更新删除版本号,这也就是修改=新增+删除。
事务的作用
事务的存在就是为了保证数据的准确性及安全性,即你在银行的存款不会因为系统原因而丢失。
内容总结
以上是互联网集市为您收集整理的MySQL 数据库事务及隔离级别,多版本控制全部内容,希望文章能够帮你解决MySQL 数据库事务及隔离级别,多版本控制所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。