首页 > 数据库技术 > 详细

.Net转Java.05.为啥MySQL没有nolock

时间:2018-01-09 13:27:28      阅读:208      评论:0      收藏:0      [点我收藏+]

今天忽然想到一个问题,原来为了提高SQL Server性能,公司规定查询语句一般都要加 WITH (NOLOCK)的

现在转Java了,用了MySQL为啥不提这个事情了?
技术分享图片

 

先在MySQL里写了一个查询语句,比样子加了nolock,提示语法不正确,难道是用READUNCOMMITTED?  依然提示语法不正确,

看来MySQL是不支持nolock之类的语法

然后的问题变成了,为什么MySQL不需要支持nolock之类的语法,或者如果MySQL不支持nolock,修改记录导致锁表怎么办?

所以我做了下面的实验

给开了两个MySQL连接,(顺便插一句,因为用的客户端是SQLyog,本以为跟SQL Server Management Studio一样每个“询问”就是一个连接,其实不是,每个连接都要“创建新连接”,我自己测试半天才发现这个问题)

 第一个MySQL连接执行查询

START TRANSACTION;
UPDATE testtable SET NAME=newvalue WHERE id=1

因为事务没有提交,如果是SQLServer的默认情况下,第二个连接再查询同一条记录,肯定会被阻塞的。如果SQLServer查询加了Nolock读取到的是还未commit的脏值“newvalue”

第二个MySQL连接我执行查询

SELECT * FROM `testtable`

我发现既没有发生阻塞,也没有发生脏读,查询到的是老的值,并没有读到未提交的新值newvalue

也就是说MySQL和SQLServer默认维护事务的机制是不同的,

SQLServer 默认情况下一个事务修改了某个值,在这个事务提交前,是阻塞其他连接来读取这个修改中的值的,如果加nolock读取到的是修改后为提交的值(也就是脏读,因为可能这个值最终会回滚)

MySQL 默认情况下,一个事务修改了某个值,在这个事务提交前,不阻塞其他连接来读取这个修改中的值,并且读取到的是修改前的值。

对于互联网公司,绝大多数场景,都不希望写的事务来阻塞读,

所以SQLServer建议加nolock

MySQL本身就不阻塞,nolock也就没有意义了。。

.Net转Java.05.为啥MySQL没有nolock

原文:https://www.cnblogs.com/wormday/p/8059735.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!