MySQL可重复读级别能够解决幻读吗可重复读级别能够解决幻读吗
主要给大家介绍了关于MySQL可重复读级别能否解决幻读的相关资料,文中通过示例代码介绍的非常详细,对
大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
引言引言
之前在深入了解数据库理论的时候,了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测
试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读,我发现在可重复读的隔离级
别下没有出现,当时想到难道是MySQL对幻读做了什么处理?
测试:
创建一张测试用的表dept:
CREATE TABLE `dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8
insert into dept(name) values("后勤部")
事物事物 1 事物事物 2
begin begin
select * from
dept
-
insert into dept(name) values("研发
部")
- commit
select * from
dept
commit
根据上面的流程执行,预期来说应该是事物1的第一条select查询出一条数据,第二个select查询出两条数据(包含事物2提交的
数据)。
但是在实际测试中发现第二条select实际上也只查询处理一条数据。这是但是根据数据库理论的可重复读的实现(排他锁和共享
锁)这是不应该的情况。
在了解实际原因前我们先复习下事物的相关理论。
数据库原理理论数据库原理理论
事物事物
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行
单元(unit)。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。在关系数据库中,一个
事务可以是一组SQL语句或整个程序。
为什么要有事物为什么要有事物
一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:
为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库在异常状态下仍能保持一致性的方法。
当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,保证彼此的操作互相干扰。
事物特性事物特性
事务具有4个特性:原子性、一致性、隔离性、持久性。这四个属性通常称为 ACID 特性。
原子性(atomicity):
一个事务应该是一个不可分割的工作单位,事务中包括的操作要么都成功,要么都不成功。
一致性(consistency):
事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离性(isolation):
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据在事物未提交前对并发的其他事务是隔离
的,并发执行的各个事务之间不能互相影响。
持久性(durability):
评论11