16

http://www.sqlite.org/lang_conflict.htmlから

ABORT 該当する制約違反が発生すると、ABORT 解決アルゴリズムは、現在の SQL ステートメントを SQLITE_CONSTRAIT エラーで中止し、現在の SQL ステートメントによって行われた変更を取り消します。ただし、同じトランザクション内の以前の SQL ステートメントによって引き起こされた変更は保持され、トランザクションはアクティブなままです。これはデフォルトの動作であり、SQL 標準で禁止されている動作です。

FAIL 該当する制約違反が発生すると、FAIL 解決アルゴリズムは現在の SQL ステートメントを SQLITE_CONSTRAINT エラーで中止します。ただし、FAIL 解決では、失敗した SQL ステートメントの以前の変更が取り消されたり、トランザクションが終了したりすることはありません。たとえば、UPDATE ステートメントが更新を試行する 100 行目で制約違反を検出した場合、最初の 99 行の変更は保持されますが、100 行以降の変更は発生しません。

どちらも、制約違反の原因となったステートメントの前に行われた変更を保持し、トランザクションを終了しません。したがって、唯一の違いは、FAIL 解決ではそれ以上変更を加えることができないのに対し、ABORT では競合するステートメントのみをバックアップすることだけだと思います。私は正しかったですか?

4

1 に答える 1

19

答えは簡単です。FAIL は、現在のステートメントによって行われた変更をロールバックしません。

これらの 2 つのテーブルを検討してください。

CREATE TABLE IF NOT EXISTS constFAIL (num UNIQUE ON CONFLICT FAIL);
CREATE TABLE IF NOT EXISTS constABORT (num UNIQUE ON CONFLICT ABORT);
INSERT INTO constFAIL VALUES (1),(3),(4),(5);
INSERT INTO constABORT VALUES (1),(3),(4),(5);

ステートメント

UPDATE constABORT SET num=num+1 WHERE num<5

失敗し、何も変わりません。しかし、この発言

UPDATE constFAIL SET num=num+1 WHERE num<5

最初の行を更新し、失敗して 1 行を更新したままにするため、新しい値は 2、3、4、5 になります。

于 2013-06-23T10:45:34.710 に答える