【经验随笔】MYSQL表加锁升级导致数据库访问失败

本文通过实验揭示了在Spring管理的MYSQL连接中,若一个线程对部分表加锁且未释放,则其他线程即使访问未加锁的表也会失败。说明了在多线程环境中加锁操作的重要性。

背景:有一次定位问题发现,在同一个session连接中对MYSQL部分表加锁,导致其它未加锁的表不能访问。

用Spring管理MYSQL数据连接,在多线程访问数据库的情况下容易出问题。一个线程中对部分表加锁了,尚未释放。其它线程访问同一数据库中其它未加锁的表,也会访问失败。

测试了一把:

步骤一、使用Navicat连接MYSQL数据库。编写如下4句SQL。
  1. LOCK TABLES tbl_A WRITE;

  2. LOCK TABLES tbl_B WRITE;

  3. DELETE FROM tbl_B;

  4. UNLOCK TABLES;

步骤二、先执行1、再执行3。报如下错误:[Err] 1100 - Table ‘tbl_B’ was not locked with LOCK TABLES。
步骤三、先执行1、再执行2、再执行3。正常。
步骤四、选两台电脑用Navicat连同一个库。在一台电脑上执行1、在另一台电脑上执行3,可以正常执行。说明加锁升级控制在一个连接会话中,不同的连接不受影响。

结论:在共享数据库会话连接的多线程程序中对数据库表加锁,务必对所有要访问的表都加锁。不同会话连接则不受这类锁升级的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值