2012-08-17 80 views
0

我的問題是,我要插入新行的計算值依賴於選擇,在交易先前執行。但是避免,並行事務插入相同的計算值。鎖定表像PostgreSQL的

這個問題應該通過事務隔離級別SERIALIZABLE避免。但事實並非如此。

  1. TRANSACTION A:

    我通過以下步驟來運行BEGIN;

  2. 交易B:BEGIN;
  3. 交易A:從tableName中選擇max(x);
  4. TRANSACTION B:從tableName中選擇max(x);
  5. TRANSACTION B:插入到表名(X,PK_COLUMN)值(最大+ 1,primaryKeyA);
  6. 事務A:插入到表名(X,PK_COLUMN)值(最大+ 1,primaryKeyB);
  7. 交易A:COMMIT;
  8. 交易B:COMMIT;

在此之後,在MySQL中,我有兩個具有相同x值的新行,但我希望兩個事務中的一箇中止。

在PostgreSQL上,我可以做一個LOCK TABLE tableName IN SHARE MODE,這樣可以防止TRANSACTION A執行第6步。在MySQL上,我嘗試了http://dev.mysql.com/doc/refman/5.1/de/lock-tables.html下描述的LOCKING技術,但沒有成功。

有什麼建議嗎?謝謝。

回答

0

我發現這個問題。 MySQL工作臺不會爲每個SQL窗口叉一個新的事務....所以我是用獨一無二的交易工作.... 使用連接到服務器的兩個端子之後。一切按預期工作。