mysql update子查询锁表

阅读数:490 评论数:0

跳转到新版页面

分类

数据库

正文

数据库的隔离级别

隔离级别 脏读 不可重复读 幻读
Read uncommitted(读取未提交)
Read committed(读取提交) ×
Repeatable read(可重复读) × ×
Serializable(串行) × × ×

目前主流的数据库往往都采用了Read committed和Repeatable read。不可重复读针对的是update或delete,而幻读针对的是insert。当事物A首先进行了一次数据读取,然后事务B对这数据进行了改变(如果是update或delete即是不可重复读,如果是insert即是幻读),然后事物A再次进行一次同样的数据读取,发现数据两次不一致。

 

mysql的隔离级别是repeatable read,Oracle默认是Read commited。

设置mysql的隔离级别

show global variables like '%isolation%';

set global transaction_isolation='read-commited';

可重复读

1、什么是可重复读?

即事务A在读到一条数据之后,此时事务B对该数据进行了修改并提交,那么事务A再读该数据,读到的还是原来的内容。

2、实现原理(MVCC[多版本并发控制])

InnoDB在每行记录中隐藏版本号,当数据被修改时,新的数据版本号会加1,从而当前读事务的版本号小于实际数据的版本号,自然就读不到更新后的数据了。

3、总结

因为mysql的可重复读,对事务B查询时,事务A提交的更新不会影响到事务B。

但是对事务B进行更新时,事务A提交的更新会影响到事务B。

 




相关推荐