zoukankan      html  css  js  c++  java
  • SqlServer With(nolock)

    转自:https://blog.csdn.net/yangjiechao945/article/details/81355558
    为什么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也就没有意义了。。.

    最后总结:SQLServer数据库 查询时不加 with(nolock)可能会导致查询阻塞,加了可能导致脏读(但此时用户A读取到的是新的数据,但是用户B在事务中修改该数据没有提交的话,可能会回滚,这时候用户A读取的数据是B修改后的数据,但是B回滚的话,用户A读的数据就不是真实的数据了)

  • 相关阅读:
    struts2中<s:select>标签的使用
    正则表达式(括号)、[中括号]、{大括号}的区别小结
    解读邮箱正则表达式:^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$
    Struts2国际化-getText()方法
    Eclipse的Tomcat热部署,免重启的方法
    hdu 5056Boring count
    纸板上的虚拟现实和代码中的Cardboard
    OC-Protocol实现业务代理
    UVA 11237
    mysql相关日志汇总
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/13048721.html
Copyright © 2011-2022 走看看