0
鎖定我需要明確地鎖定在表中的行對一個連接,其中:悲觀行與HSQLDB
- 讀取數據;
- (有些邏輯會在兩者之間運行)
- 更新db中的對應行;
雖然其他連接將無法讀取數據,禁用髒讀(所以隔離級別是沒有問題的)。
閱讀documentation,但沒有完全理解它。我目前的理解是否正確:
- 將併發控制模型設置爲MVCC;
- 將事務隔離級別設置爲READ COMMITTED(實際上已經是默認值);
- 將Connection對象的自動提交值設置爲false;
- create Statement/PreparedStatement;
- 在語句或PreparedStatement對象上運行'SELECT/-/FOR UPDATE'查詢並接收ResultSet;
- - 執行一些邏輯 -
- 使用ResultSet updateX()方法或新的UPDATE sql(executeUpdate())更新該行。
- 提交更改。
是否有任何步驟是多餘的,丟失或者我完全誤解了整個概念?
爲什麼「SELECT/-/FOR UPDATE」鎖定其他事務的行?真的是你的第二步來鎖定它(即更新現有或更改的值)? PS,如果併發模型沒有設置爲MVCC,那麼整個表被鎖定,而不是一行,對不對? – basher
它沒有。第二步是鎖定行。如果該模型不是MVCC,則整個表被鎖定。如果不使用MVCC,而不是第一次更新,則可以將表鎖定爲明確寫入。 – fredt
我不明白這是如何實現悲觀鎖定的。 所以如果流量是: 1.開始交易 2.選擇 3.更新(與當前值) 4。(一些應用程序代碼) 5.更新(具有更新值) 6.提交 如果2個線程同時執行此操作,則線程2將在步驟3中阻塞。 但是,當第一個線程提交時,線程2將繼續,並且將執行步驟#3的更新,並覆蓋保存在線程1中的值。 - >丟失更新。 所以我不認爲這個策略實際上有效? 我需要能夠做SELECT ... FOR UPDATE。任何提示歡迎, –