当前读

取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同**记录,避免出现安全问题**。

实例:

  1. select...lock in share mode (共享读锁)
  2. select...for update
  3. update , delete , insert

例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。

比如我们新建一个表,然后新建两行数据,现在表的内容是这样的:
image.png
我们新建一个事务,称为Query1。

begin;
    select * from test1;  ## 第一次查询
    select * from test1;  ## 第二次查询
commit;

然后执行第一次查询的语句,查询内容跟表内容一样,正常。
image.png
然后我们新建一个事务,执行update操作,我们称为Query2

begin;
update test1 set `name` = 'yunzhi' where id = 1;
select * from test1;
commit;

执行他Query2,此时查询结果为
image.png
然后再执行Query1的第二次查询
image.png
我们发现Query1的查询和Query2的查询的结果是不同的。

高并发下解决幻读的方式:行锁+间隙锁

快照读

单纯的select操作
Read Committed(读已提交)隔离级别:每次select都生成一个快照读。
Read Repeatable(可重复读)隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读。
**
高并发下解决幻读的方式:MVCC(Multi-Version Concurrency Control)(多版本控制)

总结

mysql查询操作默认执行快照读操作,修改数据会执行当前读操作。