开发者社区> 问答> 正文

MySQL 不同隔离级别加锁情况,数据库报错

"

对于MySQL 各种隔离级别的加锁情况分析的博客很多

但对 read uncommitted 这个级别的加锁情况分析总是一笔带过。

甚至美团的博客简述 read uncommitted 隔离级别不加任何锁。

但我分析下来确实是加锁的,比如t1,t2两个事务,t1 更新一条记录,t2 更新同一条记录,两者事务都没有提交的情况下,t1事务加的是 X 行级排他锁,t2事务会阻塞,但是对于加锁的时长有的博客说是跟新完即释放排他锁,如果是这样的话,这也就是说其实t2事务是可以更新的不会阻塞,但其实不然,所以我大胆猜测t1事务的行级锁会在事务提交时释放。但是如果行级排它锁到事务提交时释放的话,为什么t2事务可以读到在t1 事务没有释放排他锁时,可以读到t1事务更改后的值呢。

请大神解释下,我很困惑,谢谢了!

" ![image.png](https://ucc.alicdn.com/pic/developer-ecology/1b80d7047462488aa473b510276aaf86.png)

展开
收起
python小菜菜 2020-06-01 19:44:08 652 0
1 条回答
写回答
取消 提交回答
  • "

    找到答案了:

    ```Transactions running at the READ UNCOMMITTED level do not issue shared locks to prevent other transactions from modifying data read by the current transaction. READ UNCOMMITTED transactions are also not blocked by exclusive locks that would prevent the current transaction from reading rows that have been modified but not committed by other transactions.

    ``

    对应翻译

    ```

     

    在READ UNCOMMITTED级别运行的事务不会发出共享锁,以防止其他事务修改当前事务读取的数据。读取UNCOMMITTED事务也不被排除锁阻止,这将阻止当前事务读取已被修改但未被其他事务提交的行。设置此选项时,可以读取未提交的修改,称为脏读。可以更改数据中的值,并且行可以在事务结束之前在数据集中显示或消失。此选项与在事务中的所有SELECT语句中的所有表上设置NOLOCK具有相同的效果。这是隔离级别的最小限制

    ```

    " ![image.png](https://ucc.alicdn.com/pic/developer-ecology/b28974e7de954bfb98ba7185fd636768.png)
    2020-06-01 19:44:15
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像