考虑以下 perl 代码:
$schema->txn_begin();
my $r = $schema->resultset('test1')->find({id=>20});
my $n = $r->num;
$r->num($n+1);
print("updating for $$\n");
$r->update();
print("$$ val: ".$r->num."\n");
sleep(4);
$schema->txn_commit();
我期望由于更新受事务保护,那么如果两个进程尝试更新“num”字段,第二个进程应该会失败并出现一些错误,因为它失去了比赛。Interbase 将此称为“死锁”错误。然而,MySQL 会在 update() 调用上暂停,但会在第一个调用提交后愉快地继续。然后第二个进程具有 num 的“旧”值,导致增量不正确。观察:
$ perl trans.pl & sleep 1 ; perl trans.pl
[1] 5569
updating for 5569
5569 val: 1015
updating for 5571
5571 val: 1015
[1]+ Done perl trans.pl
在这两种情况下,结果值都是“1015”。这怎么可能是正确的?