那就是我的问题:

我有一个带有列的表:ID,VALUE和SYNCHRONICED。 last是一个标志,指示自上次更新以来是否已将行发送到服务器。我正在运行一些可以访问数据库的线程

我的问题来自那个用例(具有两个线程T1和T2:

T1-->Start_Send-->Query_Values-->Send_to_server-->wait_answer-->sync=1_for_sent_rows
T2------------------------->Update_a_row_sent


此时,T1已用sync = 1标记了T2更新的值。

有什么办法可以避免这个问题?


查询和更新的方法不同,因此不能在该方法中使用同步。
在T1结束之前,如果T2被阻塞没有问题


谢谢

最佳答案

假设SYNCHRONICED在插入或更新记录时为0,在将记录发送到服务器时为1,在服务器确认同步时为2。

T1线程应执行以下操作:

BEGIN;
SELECT ID, VALUE FROM TAB WHERE SYNCHRONICED = 0;
UPDATE TAB SET SYNCHRONICED = 1 WHERE SYNCHRONICED = 0;
COMMIT;


select语句提供要发送到服务器的记录。

现在,任何insertupdate到TAB都应设置SYNCHRONICED = 0;

当服务器回复ack时,

UPDATE TAB SET SYNCHRONICED = 2 WHERE SYNCHRONICED = 1;


这不会影响任何更新的记录或插入的记录,因为它们的SYNCHRONICED为0。

08-20 03:53