2012-03-30 6 views
3

結合を使用したSQL問合せでは、トランザクションを使用する必要がありますか?私のようなものを考えていた結合クエリのトランザクションが必要ですか?

Delete table1, table2, table3 
FROM table1 INNER JOIN table2 ON(...) 
LEFT JOIN table3 ON (...) 
WHERE table1.column = something... 

(私は構文が100%正しいかどう知らないが、私はとにかくそれを理解していることを推測する)

はそのすべてではない任意の危険性があります削除すべき行は削除されませんか?

ありがとうございます!

答えて

4

をチェックし、これは単一のコマンドであるので、(DELETE)明示的にトランザクションを使用する必要はありません。 SQLコマンドは定義によってアトミックです。すなわち、基準に一致するすべての行を削除するか、まったくエラーがないかのいずれかを行います。

EDIT:この回答は理論上、ACIDをサポートするデータベースでは正しいです。データベースがアトミック性をサポートしていない場合、またはデータベースエンジンの一部で不正な動作を引き起こすバグがある場合、すべてのベットはオフです。しかし、これらのシナリオではトランザクションを使用すると魔法のように改善されることはありません。

+2

これは、InnoDBテーブルに影響を与える文にのみ当てはまります。例えば、 MyISAMテーブルはアトミックではなく、テーブルの半分しか削除しないかもしれません。 –

+0

@a_horse_with_no_name - これは、ACIDテーブルに対してのみ正しいことに同意します。しかし、私はMyISAMテーブルの経験がないので、トランザクションがそのシナリオに役立つかどうかはわかりません。 – SWeko

+0

@SWeko場合によっては、ロールバックされません。とにかくMySQL v5.1(http://bugs.mysql.com/bug.php?id=45309を参照) – mattytommo

5

私は、トランザクションを使用すると何もしないと思います。ほとんどの場合、単一のクエリはアトミックであり、単一のトランザクションで実行されます。 MS-SQLサーバーのクエリに関しては、ログのない一括挿入や切り捨てなどのトランザクションが必要な場合があります。あなたの場合、あなたはdeleteステートメントの回りに転記をする必要はありません。複数の文があるなら、あなたは、すべてまたはnoneが実行されますように、単一のトランザクションでそれらをラップする必要が このquestion

4

いいえ、取引は必要ありません。トランザクションは、複数のステートメントを1つの単位として実行します。トランザクション内またはトランザクション外で単一の文を実行すると、常に同じ結果が得られます。

あなたの最後の質問に答えるために、この声明はすべてかどうかです。声明の真ん中に停電があったとしても、取引はそれを助けません。任意のINSERTUPDATESELECTDELETE声明については

1

は、明示的なトランザクションのコマンドが存在しない、とエラーが発生した場合、データベースエンジンは、文全体をロールバックします。

関連する問題