2017-08-16 61 views
0

防止脏读我有一个MySQL表在MySQL

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

假设我读从机M1,M2,M3,M4这个应用,其相互的H.A。

我要的是:

如果status == unread 那么M1中的任何一个(也只能),M2,M3,M4可以拿起该行改变其状态processing,并进一步对其进行处理。

但我面对的是多脏的哪些问题读为M1,M2,M3,M4同时阅读status = unread他们同时改变的状态processing并开始处理它。

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

回答

0

不知道为什么它是关于java和多线程,因为你是从不同的机器访问数据库,但一般SELECT ... FOR UPDATE是你想要的。

+0

因为我用java与MySQL进行通讯,所以弹簧启动更具体 –

+0

没关系。如果你使用JDBC,你也可以调用这个构造。 – Andremoniy

+0

当我从机器m1,m2,m3,m4读取数据时,这将确保m1,m2,m3,m4中只有一个读取表格,如果status = unread,则修改其状态'并处理它 –

0

这个问题看起来喜欢与商务一致的数据。

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

首先,您可以在访问数据时使用通过悲观锁锁定行数据。 像:

select ... from test for update 

这种方法是由数据库系统提供的。

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

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

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

看你的情况,各地的应用程序将执行语句1,并得到CURRENTVERSION,当他们执行语句2,该语句2将返回多少行已changed.But只有一个结果是大于零大,其他人是零。所以你可以检查它是否为零,并取决于是否执行你的bussniess。