2014-02-24 71 views
0

鎖定我需要明確地鎖定在表中的行對一個連接,其中:悲觀行與HSQLDB

  • 讀取數據;
  • (有些邏輯會在兩者之間運行)
  • 更新db中的對應行;

雖然其他連接將無法讀取數據,禁用髒讀(所以隔離級別是沒有問題的)。

閱讀documentation,但沒有完全理解它。我目前的理解是否正確:

  • 將併發控制模型設置爲MVCC;
  • 將事務隔離級別設置爲READ COMMITTED(實際上已經是默認值);
  • 將Connection對象的自動提交值設置爲false;
  • create Statement/PreparedStatement;
  • 在語句或PreparedStatement對象上運行'SELECT/-/FOR UPDATE'查詢並接收ResultSet;
  • - 執行一些邏輯 -
  • 使用ResultSet updateX()方法或新的UPDATE sql(executeUpdate())更新該行。
  • 提交更改。

是否有任何步驟是多餘的,丟失或者我完全誤解了整個概念?

回答

0

正確的方法是在開始和結束時更新行。下面是創建語句的步驟。

  • CREATE語句
  • 更新該行憑藉其現有的值(或更改的值如果在這一點上已知的)
  • 執行其他操作
  • 更新與改變的值的行(如果不這樣做前)
  • 提交

如果你不這樣做,像上面,其他事務可能這個交易之前更改行罐體C將它吊起來。

+0

爲什麼「SELECT/-/FOR UPDATE」鎖定其他事務的行?真的是你的第二步來鎖定它(即更新現有或更改的值)? PS,如果併發模型沒有設置爲MVCC,那麼整個表被鎖定,而不是一行,對不對? – basher

+0

它沒有。第二步是鎖定行。如果該模型不是MVCC,則整個表被鎖定。如果不使用MVCC,而不是第一次更新,則可以將表鎖定爲明確寫入。 – fredt

+0

我不明白這是如何實現悲觀鎖定的。 所以如果流量是: 1.開始交易 2.選擇 3.更新(與當前值) 4。(一些應用程序代碼) 5.更新(具有更新值) 6.提交 如果2個線程同時執行此操作,則線程2將在步驟3中阻塞。 但是,當第一個線程提交時,線程2將繼續,並且將執行步驟#3的更新,並覆蓋保存在線程1中的值。 - >丟失更新。 所以我不認爲這個策略實際上有效? 我需要能夠做SELECT ... FOR UPDATE。任何提示歡迎, –