作者:宁愿juejin.im/post/5c9040e95188252d92095a9e引言之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。
***幻读(phantom read) ********,是指在一个事务中前后两次相同的查询产生不同的结果集,后一次查询看到了前一次查询没有看到的记录行。MySQL InnoDB默认的事务隔离级别是可重复读,可重复读的要旨在于同一数据行记录在一个事务内无论何时查询结果都是一样的。
间隙锁(Gap Lock)是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制,(下面的所有案例没有特意强调都使用可重复读隔离级别)幻读的问题存在是因为新增或者更新操作,这时如果进行范围查询的时候(加锁查询),会出现不一致的问题,这时使用不同的行锁已经没有办法满足要求,需
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。事务用来管理 DDL、DML、DCL 操作,比如 insert,update,delete 语句,默认是自动提交的。
比如如下的例子:1.a事务先select,b事务insert确实会加一个gap锁,但是如果b事务commit,这个gap锁就会释放2. a事务再select出来的结果在MVCC下还和第一次select一样3. 接着a事务不加条件地update,这个update会作用在所有行上4.
不可重复读即当事务 A 按照查询条件得到了一个结果集,这时事务 B 对事务 A 查询的结果集数据做了修改操作,之后事务 A 为了数据校验继续按照之前的查询条件得到的结果集 与前一次查询不同 ,导致不可重复读取原始数据。