对Mysql的update操作会阻塞select操作

weixin_36389666 2018-06-14 10:47:26
今天在项目中发现一个问题,MySQL的事务隔离级别是默认的可重复读,对于同一张表,里面存放了大量的名称为A的数据和名称为B的数据。我需要修改数据中某一列的值。为了高效就起了两个线程,线程1update名称为A的记录,线程2update名称为B的记录。但是结果和想的不一样,其中一个线程会操作的时间很长。想了下应该是数据库锁的原因,update的时候会加锁,这时另一个线程update的时候会先select,但是select又会被上一个线程的update操作阻塞。请问有什么解决方案么??谢谢
...全文
1779 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-06-16
  • 打赏
  • 举报
回复
引用 6 楼 weixin_36389666 的回复:
[quote=引用 1 楼 stacksoverflow 的回复:] 是否可以把名称为A的数据和名称为B的数据的主KEY先下载到一个文件, 然后两个线程根据主KEY只作update处理。
我的理解是MySQL执行update操作的时候是先查询所有数据,然后根据where条件过滤出符合的,最后update。这样如果有一个线程正在update(加了行级锁),另一个线程update前的查询操作会被阻塞。不知道理解的对不对,所以感觉根据主KEY只作update处理似乎不能解决问题,只是where条件多了一个主键而已[/quote] 如果name没有加索引,update应该是表锁,主键的话一般是行锁,你试一下,应该会好一些。
weixin_36389666 2018-06-15
  • 打赏
  • 举报
回复
引用 1 楼 stacksoverflow 的回复:
是否可以把名称为A的数据和名称为B的数据的主KEY先下载到一个文件, 然后两个线程根据主KEY只作update处理。
我的理解是MySQL执行update操作的时候是先查询所有数据,然后根据where条件过滤出符合的,最后update。这样如果有一个线程正在update(加了行级锁),另一个线程update前的查询操作会被阻塞。不知道理解的对不对,所以感觉根据主KEY只作update处理似乎不能解决问题,只是where条件多了一个主键而已
weixin_36389666 2018-06-15
  • 打赏
  • 举报
回复
引用 3 楼 u010825190 的回复:
使用mysql的行级锁
就是行级锁,我的意思是:比如有数据表记录属性列有code,message,time...等等。现在code为A的数据有一千万条,code为B的数据有一千万条。我现在需要将所有数据的message修改掉。为了高效,我现在有两个线程,线程1update code为A的数据,线程2 update code为B的数据。现在的问题是线程1 update的时候线程2好像会阻塞。我的理解是当我执行 update table where code = B的时候,MySQL的做法是先select所有数据,再根据where条件过滤出code = B的,最后执行update。所以在线程1update的时候加了行锁,所以线程2的select会阻塞。
stacksoverflow 2018-06-15
  • 打赏
  • 举报
回复
是否可以把名称为A的数据和名称为B的数据的主KEY先下载到一个文件, 然后两个线程根据主KEY只作update处理。
  • 打赏
  • 举报
回复
for update 只会锁定你需要的数据
  • 打赏
  • 举报
回复
使用mysql的行级锁
yjsl__ 2018-06-15
  • 打赏
  • 举报
回复
一条语句同时修改多个字段也可以的

50,527

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧