3.fooカラムの前後に/を入れたものに更新するスクリプトでわざとエラーを起こさせます c.php
<?php
try {
$db = new PDO('sqlite:test.db');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$length = $db->query('select count(*) from hoge')->fetch(); //登録されてる件数を取得します
$offset = 0;
$db->beginTransaction(); //トランザクション開始
while ($length[0] > $offset) {
$sql = 'select id, foo from hoge limit 10 offset ' . $offset; //メモリを考慮して10件ずつ更新します
$stmt = $db->prepare('update hoge set foo = ? where id = ?');
foreach ($db->query($sql) as $row) {
$stmt->exec(array('/'.$row['foo'].'/', $row['id'])); //ここでわざとエラーしてます executeなら問題なく更新できます
}
$stmt = null;
$offset += 10;
}
$db->commit();
} catch (PDOException $e) {
try {
$db->rollBack();
} catch (PDOException $e) {
}
}
?>

4.2のb.phpを実行するとデッドロックっぽいことになってるのが確認できます。

こんな感じになります。最後のコードが長くなりすみません。