我有一个Java前端和一个MySQL后端场景,我对SELECT使用了一个“锁在共享模式”。如果我从另一个进程请求同一行,它会给出数据..然而,它不允许我更新。我想要做的是通知用户,他们将只有一个只读副本,所以如果他们希望看到他们可以看到的信息,否则,他们可以请求它以后。如何检查行的状态,以便将此情况通知用户?如果我使用“for UPDATE”,它只是等待到第一个用户保存数据。我发现它不太友好,如果他们只有一个空白的屏幕,或当他们点击按钮,它什么也不做。任何帮助都将不胜感激。使用Java5.5,Java7。
发布于 2012-10-09 15:38:02
简单的回答是“你不能”!
您可能想看看this discussion。
编辑
对该职位的答复是:
你不能(检查锁的状态)找不出名字的锁!更多信息:http://forums.mysql.com/read.php?21,222363,223774#msg-223774
行级锁不适用于应用程序级别的锁。它们只是实现一致读写的手段。这意味着你必须尽快释放他们。您需要实现自己的应用程序级锁,这并不难。也许一个简单的user_id字段就可以了。如果它是空的,那么就没有锁。但是如果它不是null,则id指示谁保存记录。在这种情况下,需要行级锁定来更新user_id字段。正如我前面说过的,您必须在锁定/解锁记录之后立即释放MySQL锁。
发布于 2017-07-29 04:45:18
问题的整个前提在于直接将RDBMS的行级锁定(通常用于短暂的并发控制)直接用于交互式UI控件。
但是,抛开这个问题并回答问题,您可以将会话的innodb_lock_wait_timeout设置为一个非常短的值,最小值为1,并捕获结果的锁等待超时;当无法锁定时尝试重新启动事务。
当我刚刚尝试使用com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException时,异常类是mysql-connector-java 5.1.38,但是其他的异常类已经改变了版本,所以在旧版本的MySQL连接器/J中也可能有不同。
获取锁的“尝试和失败”方法是解决这类并发情况的标准方法,因为“尝试前检查”的替代方法是一种反模式,它在检查和实际试图锁定之间创建了一个竞争条件。
https://stackoverflow.com/questions/12803402
复制相似问题