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

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

如今转Java了,用了MySQL为啥不提这个事情了?
测试

 

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

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

而后的问题变成了,为何MySQL不须要支持nolock之类的语法,或者若是MySQL不支持nolock,修改记录致使锁表怎么办?blog

因此我作了下面的实验事务

给开了两个MySQL链接,(顺便插一句,由于用的客户端是SQLyog,本觉得跟SQL Server Management Studio同样每一个“询问”就是一个链接,其实不是,每一个链接都要“建立新链接”,我本身测试半天才发现这个问题)it

 第一个MySQL链接执行查询io

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

由于事务没有提交,若是是SQLServer的默认状况下,第二个链接再查询同一条记录,确定会被阻塞的。若是SQLServer查询加了Nolock读取到的是还未commit的脏值“newvalue”table

第二个MySQL链接我执行查询class

SELECT * FROM `testtable`

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

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

SQLServer 默认状况下一个事务修改了某个值,在这个事务提交前,是阻塞其余链接来读取这个修改中的值的,若是加nolock读取到的是修改后为提交的值(也就是脏读,由于可能这个值最终会回滚)

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

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

因此SQLServer建议加nolock

MySQL自己就不阻塞,nolock也就没有意义了。。

相关文章
相关标签/搜索