トランザクションDBでシリアル化できないものを誰かに説明してもらえますか? 例を教えてください。r1(x) r2(x)w1(y) c2 c1 これはシリアル化不可ですか?
6665 次
1 に答える
3
次の表を想像してください ( Oracle
)。
CREATE TABLE t_series (id INT NOT NULL PRIMARY KEY, value INT NOT NULL)
INSERT
INTO t_series
VALUES (1, 1)
INSERT
INTO t_series
VALUES (2, 2)
ここREAD COMMITTED
で、2 つのセッションで 2 つのトランザクションを開始します。
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
次のクエリを発行します。
-- session 1
UPDATE t_series
SET value = 1
WHERE value = 2
/
COMMIT
/
その後:
-- session 2
UPDATE t_series
SET value = 2
WHERE value = 1
/
COMMIT
/
結果は次のようになります。
id value
1 2
2 2
、つまり、両方のレコードがvalue = 2
最初のクエリは両方のレコードを にしましたがvalue = 1
、2 番目のクエリはこれらの変更を確認し、両方のレコードを にしましたvalue = 2
。
レベルで同じことを行うとSERIALIZABLE
、結果は次のようになります。
id value
1 2
2 1
、つまり、クエリは を交換するだけvalue
です
シリアライズ可能なトランザクションは、トランザクション自体によって行われた変更を除いて、トランザクションが開始されたときとまったく同じ状態でデータベースを認識します。
于 2010-02-17T16:50:01.670 に答える