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。