0

表帐户具有特殊字段“执行程序”,以便守护程序知道该帐户被阻止使用其中一个守护程序进行更新。

一步步:

  1. 开始交易
  2. 阻止帐户:

    UPDATE `account` SET `executor` = 2727 WHERE `executor` is NULL AND `id` = 1234;
    
  3. 一些操作。在此步骤中,另一个守护进程可以选择 id=1234 的行并尝试更新它(或更新另一个字段,而不是“执行程序”)

  4. 帐户状态返回:

    UPDATE `account` SET `executor` = NULL WHERE `executor` = 2727 AND `id` = 1234;
    
  5. 犯罪

有时在第 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

进一步的事务被回滚......如果再次重复操作,一切都很好,没有重置执行者的价值......

4

0 回答 0