MySQL数据库事务隔离级别详细解决方案
数据库事务的隔离级别为4,从低到高依次为。
读取未提交:允许脏读。
读取承诺:防止脏读,这是最常用的隔离级别,是大多数数据库的默认隔离级别。
可重复阅读:可防止脏读和重复阅读。
序列化:可以防止脏读、不可重复读和幻读。(事务序列化)会降低数据库的效率。
这四个层面可以解决脏读、不可重复读和幻读。
V:不可能
事务级
脏读
不可重复读
幻读
读未提交
B.
B.
B.
提交读
*
B.
B.
可重复读
*
*
B.
序列化
*
*
*
注意:我们讨论隔离级别场景,主要是在多事务的情况下。
脏读、虚幻的阅读,不可重复读
脏读:
脏读意味着当事务访问数据并修改数据时,修改尚未提交到数据库。同时,另一个事务也访问数据,然后使用数据。
不要反复读:
这意味着在一个事务读取同一数据多次。当这个交易还没有结束,另一个事务访问相同的数据。在第一个事务读取数据,两者之间,从第一个交易数据读取两次可能由于二交易性是不同的。这一切发生的时候,那是在一个事务读取两倍的数据是不同的,所以称为不可重复读取。(就是说,你不能读同样的数据内容)
影像阅读:
这种现象发生在交易不独立执行,例如,第一个事务修改表中的数据,包括表中的所有数据行。同时,第二交易也修改表中的数据,这是插入一行插入表中的新数据。然后,在未来,经营第一交易用户没有修改的数据行的表中,如果出现了一个幻觉。
例子:
表:
创建表(` cc_wsyw126_user_test_isolation_copy `
` ID ` int(11)不为空auto_increment,
`密码` varchar(64)不为空,
年龄int(11)不为空,
主键(id),
关键` ix_age `(`年龄`)
= MyISAM引擎默认的字符集utf8);
模拟数据:
插入` cc_wsyw126_user_test_isolation_copy `(`密码`,`年龄`)
价值观
(1,1),
(2,2),
(3',3),
(一,4);
第一笔交易:
开始交易
插入cc_wsyw126_user_test_isolation_copy(密码、年龄)值(年,5)
承诺
第二个事务B:
开始交易
更新cc_wsyw126_user_test_isolation_copy设定年龄= 2 = 2的密码>
SELECT * FROM cc_wsyw126_user_test_isolation_copy在密码> 2;
承诺
重复步骤:
只要事务的INSERT语句在b事务之前,选择和更新之后。
MySQL InnoDB存储引擎实现了一个基于多版本并发控制协议-- MVCC(多版本并发控制)加上间隙锁(下键锁定)策略,不可重复读的存在(RR)隔离级别。如果测试是虚幻的,实验在MyISAM。
在聚集索引(主键索引),如果有一个独特的约束,InnoDB会降低违约记录下钥匙锁锁。
谢谢你的阅读。我希望你能帮助你,谢谢你对这个站的支持。