一、事务锁
1、个人理解:
专一性和历史性,例如一个男人历史上是花心的,但当他成长后开启begin和update后变的专一了,多项事务也影响不到他了,直到水泥封心,只可被一个人查询在此我们进入正题:
一、我们建立docker下的mysql镜像创建表格如下并且开启多会话进行实验:
2、插入数据正常查询比较
第一事务:
第二事务:
开启事务锁后比较:
很明显在我没有提交事务的时候,数据被锁住了无法查询,除非你提交数据才可查询
二、共享锁
开启共享锁的时候lock in shar mode;
数据是可读的,但是是不能写的
三、mysql 有四级事务隔离级别
读未提交 READ-UNCOMMITTED | 0:存在脏读,不可重复读,幻读的问题
读已提交 READ-COMMITTED | 1:解决脏读的问题,存在不可重复读,幻读的问题
可重复读 REPEATABLE-READ | 2:解决脏读,不可重复读的问题,存在幻读的问题,默认隔离级别,使用 MMVC机制 实现可重复读
序列化 SERIALIZABLE | 3:解决脏读,不可重复读,幻读,可保证事务安全,但完全串行执行,性能最低
解释:
脏读(Dirty Read):
脏读发生在一个事务中读取了另一个事务未提交的数据。也就是说,一个事务读取了另一个事务的临时数据,但是这些数据可能会在后续操作中被回滚,从而导致读取到的数据实际上是无效的。
例如,一个事务 A 更新了某一行数据,但还没有提交。此时另一个事务 B 来读取了这个数据,然后事务 A 回滚了操作。这样事务 B 读取到的数据就是无效的,因为它实际上并不应该被提交。
幻读(Phantom Read):
幻读是指在一个事务中,同一查询在不同时间执行时,得到的结果集不一致。通常,这是因为另一个事务插入了新的数据行或删除了数据行,导致查询结果不一致。
解决幻读问题:
为什么说 MVCC 和 Gap Lock 解决了 MySQL 的幻读问题 - piperck - 博客园 (cnblogs.com)