Spring / JPA - 如何安全地增加计数器

时间:2017-06-14 02:54:36

标签: java spring jpa thread-safety counter

拥有用于存储一些唯一标识符的表。我的第一个想法是为每个标识符前缀添加增量计数器列,如下所示:

ID IDENTIFIER COUNTER
 1 B-1        1
 2 A-1        1
 3 A-2        2
 4 A-3        3
 5 B-2        2
 6 BBA-1      1
 7 BBA-2      2

每个标识符都以字母或字母组合为前缀,并以某个增量编号扩展。例如,如果我想添加带有A-前缀的新标识符,则必须选择其中IDENTIFIER以'A-'开头的计数器的最大值,返回值增加1,将其与搜索的前缀连接并持续到数据库。 使用这种方法,当两个并行线程获取相同的计数器值时,我害怕并发问题,将违反唯一性规则。

我该怎样防止这种情况?有两个表是更好的方法,其中一个人只会为每个标识符基础处理单独的计数器,如下所示:

 BASE COUNTER
 A    3
 B    2
 BBA  2

Spring或JPA是否有某种机制来处理这个问题?我目前的第一个想法是乐观锁定和@Version注释。它是否有用,因为我的项目中已经有JPA映射了?

1 个答案:

答案 0 :(得分:-1)

您可以在MySQL上使用CAS。

  1. 从$ your_table中选择COUNTER,其中IDENTIFIER = $ your_IDENTIFIER
  2. 这里有$ count

    1. 更新$ your_table设置COUNTER =($ count + 1)其中IDENTIFIER = $ your_IDENTIFIER和COUNTER = $ count