那就是我的问题:
我有一个带有列的表: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
语句提供要发送到服务器的记录。现在,任何
insert
或update
到TAB都应设置SYNCHRONICED = 0;
当服务器回复ack时,
UPDATE TAB SET SYNCHRONICED = 2 WHERE SYNCHRONICED = 1;
这不会影响任何更新的记录或插入的记录,因为它们的
SYNCHRONICED
为0。