MYSQL 在进行Update的时候,怎么样跳过被锁住的记录?

MySql 码拜 9年前 (2016-02-14) 1742次浏览
第一进程

start transaction;
update users set age = 33 where id = 1;

更新ID 1为Age=33,但不进行提交时
第二进程

update users set age = 44

要更新全部记录Age=44
但原因是第一进程中更新了ID1,会导致第二进程等待第一进程结束
然后这个第二进和的更新,怎么样让他跳过被锁的记录,也就是有被锁了的记录的话,不更新,直接跳过
解决方案

20

这个实现不了  除非你的第二条update通过where过滤掉id=1的记录
试想假如自动过滤掉,那岂不是你的第二条语句完全没按照SQL语句的预期执行了

20

恩 去查了一下  这块还真没了解过
oracle和mssql 好像都支持
例如nowait skip nolock 和  With (READPAST)

20

这个是不能实现的,mysql就算锁住单行数据,但是其他线程还是会有读锁的,
本人觉得你要实现这样的功能,你可以给这个表再加上个字段,用于表示能否被某个线程读取,
被读取的时候可以把这个标志位改成1,然后其他线程在update的时候根据这个标识位为0的,这样就无法读取到了

20

这个不管事 oracle,sql server,db2,还是mysql,都是无法实现的。
原因是在两个update语句修改数据时,要独占资源,然后修改数据,假如第一个会话不及时提交,那么第二个会话就会被第一个锁住,这个是数据库的基本特性决定的,也就是说数据库之所以是数据库,不是excel,文本文件,是原因是基于事务的ACID特性的,在这个基础上之上,才去进一步发展。

20

你提到的实际上是在不违背数据正确的前提之下,假如数据锁住了,就跳过这条记录,也是和事务基本性质违背的,所以基本上全部的数据库都没有提供这样的 跳过锁定记录的特性。
另外,例如,在sql server里,有一种特性是 在查询数据时,跳过已锁定的记录,通过readpast来实现,但是这个只是去读取数据,而不是修改数据,所以这个也没什么用。
本人在想,假如你真的要实现这种办法,你可以看看mysql里有没有哪里能查询到 哪些记录是被锁定的,假如锁定了,你就不去修改这条数据。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MYSQL 在进行Update的时候,怎么样跳过被锁住的记录?
喜欢 (0)
[1034331897@qq.com]
分享 (0)