有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java自管理单调递增密钥或系统的时间戳

我们有一个用例,其中我们保持一个单调递增的键,表示客户数据的当前版本。如果在读取数据和处理数据之间存在延迟,并且第三方呼叫者获得多个版本,则系统中使用它来计算最新版本,并解决冲突

CUSTOMER_RESOURCE_ID   CURRENT_VERSION
132323                  1234 

如果这个资源发生了变化,我们将版本从1234增加到1235(即使我们将其增加到1300,只要它不下降,也完全可以)。为此,我们需要先读取值,然后更新它

另一种选择是使用DB的时间戳,并使用DB的时间戳不断更新版本,而DB的时间戳将一直在增加。由于这只是一个系统,时钟偏移只能在我们改变分贝时发生。此外,我们并不特别关心多个线程在一段时间内(即时间戳的最小粒度)更新数据的情况,因为我们有另一个锁,根据该锁,一次只有一个线程更新资源

我想知道我们是否可以使用数据库的系统时间戳来避免只需更新的选择和增量

这种方法有什么问题吗?我认为这会减少数据库的开销,但我不知道我们在这里节省了多少


共 (1) 个答案

  1. # 1 楼答案

    可以讨论许多方法。在我看来

    您甚至可以使用默认列值而不是数据库时间戳的增量序列。也许几秒钟会给你带来麻烦

    此外,如果您的表不是很大,而且资源充足,您可以添加一个is_last_version列,该列将随着每次插入而更新,以在性能上查询客户的上一个版本(即select * from customers where customer_id = 123 and is_last_version= 1以消除订购成本)。因此,您可以知道哪一行是最后一个版本。但每次插入的时间都会更长。你应该测试一下

    例如:

    客户资源:

    CUSTOMER_RESOURCE_ID   CURRENT_VERSION_ID         IS_LAST_VERSION          INSERT_TIME
                            (default seq)                                (default sysdate  optionally)
    132323                      1                            1               
    132324                      2                            1
    132325                      3                            1                      
    132326                      4                            0
    132327                      5                            0
    132328                      6                            1
    132326                      7                            0 
    132329                      8                            1
    132326                      9                            1
    132327                      10                           1
    

    插入时:

    update CUSTOMER_RESOURCE 
    SET IS_LAST_VERSION = 0
    where CUSTOMER_RESOURCE_ID = 132326;
    
    insert into CUSTOMER_RESOURCE(CUSTOMER_RESOURCE_ID,IS_LAST_VERSION) VALUES (132326,1);
    COMMIT;
    

    选择客户的最后版本时:

    select * from customers where customer_id = 123 and is_last_version= 1;