考慮下面的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