这是我所拥有的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%确定......
答案 0 :(得分:1)
您不需要第二个语句中的事务代码。只需使用
update config_per_geo set counter = 0;
config_per_geo将保持一致。