一致的计数器列增量?

时间:2014-12-18 09:01:39

标签: mysql multithreading hibernate concurrency sql-update

这是我所拥有的update语句,它似乎正在做我想要它做的事情,即在给定表的特定记录上增加计数器列:

update config_per_geo 
inner join country on config_per_geo.country_id = country.id 
set counter = counter + 1 
where product_id in (?, ?, ?) 
and (country.iso_code = ? or 
    (country.iso_code = 'ZZZ' and product_id not in 
        (select product_id 
         from (select * from config_per_geo) as cpg1 
         inner join country as cty1 on cpg1.country_id = cty1.id 
         where cty1.iso_code = ?)
    )
)

(由于this limitation

,似乎需要cpg1别名

问题是应该从Web应用程序(每个HTTP请求)执行此查询,其中可以同时发出多个请求,换句话说,在并发的多线程环境中。此外,我需要每天重置一次计数器字段,我想我会通过CRON工作执行此操作,或者运行:

start transaction;  
select counter from config_per_geo for update;  
update config_per_geo set counter = 0;  
commit;

问题:我想知道的是这两个查询(事务)是否总是将counter列保持在一致状态,更具体地说 - 第一个查询是否始终如一并且原子地并发执行时(来自同时请求线程)递增计数器?

我认为他们应该这样做,但基于MySQL文档,我无法为我的生活100%确定......

1 个答案:

答案 0 :(得分:1)

您不需要第二个语句中的事务代码。只需使用

update config_per_geo set counter = 0;

config_per_geo将保持一致。

另见https://stackoverflow.com/a/1171807/4350148关于单一陈述交易