我有一个MySQL表

mysql> select * from test;
+----+--------+
| id | status |
+----+--------+
|  1 |  unread     |
+----+--------+

假设我正在从彼此为HA的机器m1,m2,m3,m4中读取此应用程序。

我想要的是:

如果 status == unread则m1,m2,m3,m4中的任何一个(但只有一个)可以提取该行,将其状态更改为processing并进一步processing

但是我面临的问题是多个脏读,因为m1,m2,m3,m4同时读取status = unread读取,并且它们同时将状态更改为processing并开始处理它。

我如何确保在m1,m2,m3,m4中只有一次可以读取一行

#1楼 票数:0

不确定为什么要使用java和多线程,因为您是从不同的机器访问数据库的,但是通常您可能需要SELECT ... FOR UPDATE

#2楼 票数:0

问题看起来像关于业务一致性的数据。

有两种方法可以解决这种情况。

首先,访问数据时可以使用悲观锁来锁定行数据。 喜欢:

select ... from test for update

该方法由数据库系统提供。

第二个是乐观锁。您应该更改表格式,并添加用于标识当前数据版本的列名version 。更新数据时,应检查数据版本并增加版本。例如:

currentVersion=select version ... from test where ...    //statement1

update status=processing,version=currentVersion+1 where version=currentVersion;    //statement2

看你的情况,整个应用程序都将执行statement1并获得currentVersion,而当他们执行statement2时,statement2将返回已更改的行数。但是只有一个结果大于零,其他结果为零,因此您可以检查它是否为零,并取决于是否执行您的业务。

  ask by Prakash Pandey translate from so

未解决问题?本站智能推荐:

1回复

我们真的需要在ThreadLocal中设置Transaction吗?

我粘贴了下面的代码。 在我们的应用程序中,他们在线程本地设置事务。 其实我怀疑为什么我们需要这个呢? 如果我们没有在threadlocal中设置tranaction会发生什么?
1回复

使用BasicDataSource的MYSQL事务

我正在使用Apache BasicDataSource处理我的数据库代码-简单地,我只是创建方法来执行访问数据库的特定任务。 下面是一个例子。 我周围有一个Google,似乎找不到如何使用交易的任何示例。 请有人可以建议我如何做吗? 谢谢
2回复

Java中的MySQLTransactions

我正在尝试实施某种交易并不断失败。 这是我的代码: 但是,它不会回滚。 已经花费了近一个小时的时间来寻找解决方法。 如果有人可以帮助我,我将不胜感激。
2回复

是否可以将db表与事务中的读取操作隔离开?

我正在编写Java应用程序(Spring Data / Hibernate / JPA),该应用程序应与MySQL DB一起使用。 我有一个简单的任务,应该是原子的:1.从数据库中检索第一个项目。2.将此项目绑定到当前用户(更新项目SET user_id = current_user_id W
2回复

对于典型的Web使用,将MySQL隔离设置为“ReadUncommitted”(脏读)是否安全?即使复制?

我正在开发一个具有典型CRUD Web使用模式的网站:类似于用户创建/更新内容和其他用户阅读内容的博客或论坛。 在这种情况下,似乎可以将数据库的隔离级别设置为“ Read Uncommitted ”(脏读)。 我对“Read Uncommitted”的一般缺点的理解是读者可能会读取稍后将被
1回复

在MySQL中锁定一行以防止脏读?

有什么方法可以显式锁定表中的行? 我有一些需要在一行上运行的应用程序逻辑,如下所示(java): 因此,如果多个用户大致同时进入此代码块,则他们可能正在处理的游戏行处于各种脏状态。 在这种情况下,我想完全锁定该行,迫使其他用户等待(甚至读取它)。 有什么办法吗? 谢谢
3回复

MySQL-防止重复预定

我正在尝试找出最好的方法来停止我的应用程序中的双重“预订”。 我有一个唯一ID的表,每个表只能出售一次。 我当前的想法是使用事务检查所选产品是否可用,然后将其插入到“状态”列中以表示已被“保留”,同时插入“更新时间”,然后用户继续操作。支付我将状态更新为“出售”。 每隔10分钟,我都
1回复

事务(在MySQL中对我来说)并发运行时的行为如何?

这是我的情况: 我有表A,该表具有4行(id,col1,col2,col3),在最后3行中放置了UNIQUE索引(id为主键)。 假设有2个用户:Foo用户和Bar用户。 如果Foo和Bar两者都启动了一个事务,该事务在表A上插入了许多行,并且他们同时提交了事务,那么该表是否可能呈现UN