当前读
取的是最新版本, 并且对读取的记录加锁, 阻塞其他事务同时改动相同**记录,避免出现安全问题**。
实例:
select...lock in share mode (共享读锁)
select...for update
update , delete , insert
例如,假设要update一条记录,但是另一个事务已经delete这条数据并且commit了,如果不加锁就会产生冲突。所以update的时候肯定要是当前读,得到最新的信息并且锁定相应的记录。
比如我们新建一个表,然后新建两行数据,现在表的内容是这样的:
我们新建一个事务,称为Query1。
begin;
select * from test1; ## 第一次查询
select * from test1; ## 第二次查询
commit;
然后执行第一次查询的语句,查询内容跟表内容一样,正常。
然后我们新建一个事务,执行update操作,我们称为Query2
begin;
update test1 set `name` = 'yunzhi' where id = 1;
select * from test1;
commit;
执行他Query2,此时查询结果为
然后再执行Query1的第二次查询
我们发现Query1的查询和Query2的查询的结果是不同的。
高并发下解决幻读的方式:行锁+间隙锁
快照读
单纯的select操作
Read Committed(读已提交)隔离级别:每次select都生成一个快照读。
Read Repeatable(可重复读)隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读。
**
高并发下解决幻读的方式:MVCC(Multi-Version Concurrency Control)(多版本控制)
总结
mysql查询操作默认执行快照读操作,修改数据会执行当前读操作。