表帐户具有特殊字段“执行程序”,以便守护程序知道该帐户被阻止使用其中一个守护程序进行更新。
一步步:
- 开始交易
阻止帐户:
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
一些操作。在此步骤中,另一个守护进程可以选择 id=1234 的行并尝试更新它(或更新另一个字段,而不是“执行程序”)
帐户状态返回:
UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;
- 犯罪
有时在第 4 步 mysql 返回成功执行状态,但 0 行受到影响。它在 10000 笔交易中发生 1 次。
我究竟做错了什么?还是它的mysql错误?
更新:
观察后我得到以下信息:
1)首先我们做
UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
2) 交易区块记录
3)在交易期间我做
`UPDATE `account` SET `balance` = 1 WHERE `id` = 1234;`
4)在这个查询之后
SELECT `executor` FROM `account` WHERE `id`=1234
给出结果 2727
在重复第 3 点和第 4 点后,我们得到结果executor
=NULL... 或 0,因为我将结果写入 int 类型的变量,但这可能都是相同的 NULL...但它并不那么重要..在任何情况下 executor 不再是价值 2727
进一步的事务被回滚......如果再次重复操作,一切都很好,没有重置执行者的价值......