考虑下面的Perl代码:MySql:事务不检测死锁?
$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();
我期待的是,由于更新由事务保护的,那么,如果两个进程尝试更新“编号”栏,第二个应该失败,一些错误的原因它失去了比赛。 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”。这怎么可能是正确的?
这是一个InnoDB表吗? MySQL的其他存储引擎不支持事务。 – friedo 2009-12-21 20:47:45
是的,我忘了提及这是一个引用InnoDB表的perl DBIx类。 – 2009-12-23 20:19:44