2014-07-11 66 views
0

在同一文檔上運行併發事務時,如何保存高度爭用的記錄?Java中的TokuMX MVCC事務

看來,這種情況正在發生:

  1. MVCC事務A開始。
  2. MVCC事務B開始。
  3. 交易A更新docA和docB。
  4. 事務A提交。
  5. 事務B更新docA和docC - 由於事務A已經提交併且不保留鎖,因此獲取鎖。
  6. 事務B提交覆蓋工作轉換A已完成docA。

下面是示例代碼:

 mongoClient = new MongoClient("localhost" , 27017); 
     db = mongoClient.getDB("test"); 
     collection = db.getCollection("testData"); 

     //Create usable Mongo key from key String (i.e {_id:ObjectId("53b4477d44aef43e83c18922")}) 
     String key = "53b4477d44aef43e83c18922"; 
     String key2 = "53bfff9e44aedb6d98a5c578"; 
     ObjectId keyObj = new ObjectId(key); 
     ObjectId keyObj2 = new ObjectId(key2); 

     //Set up the transaction 
     BasicDBObject transaction = new BasicDBObject(); 
     transaction.append("beginTransaction", 1); 
     transaction.append("isolation", "mvcc"); 
     db.command(transaction); 

     //Create search query 
     BasicDBObject query = new BasicDBObject().append("_id",keyObj); 
     BasicDBObject query2 = new BasicDBObject().append("_id",keyObj2); 

     //Create set 
     BasicDBObject set = new BasicDBObject(); 
     set.append("$inc", new BasicDBObject().append("balance",50)); 

     //Run command 
     collection.update(query, set); 
     collection.update(query2, set); 

     //Commit the transactions 
     BasicDBObject commitTransaction = new BasicDBObject(); 
     commitTransaction.append("commitTransaction", 1); 
     db.command(commitTransaction); 

是否有支票,我可以做些什麼來決定是否要提交事務?或者這是TokuMX的預期行爲(或者我做錯了什麼)?

回答

2

TokuMX多語句事務與MySQL多語句事務非常相似。在你的例子中,當更新發生時,文檔級鎖將被保留,所以對該記錄的更新將被序列化。

如果因爲兩個事務同時更新同一文檔而發生衝突,則更新方法將返回一個錯誤,指出存在鎖定衝突。

爲了幫助您理解發生了什麼,請讓兩個線程運行此操作,但都沒有提交。您將看到一個線程等待並最終超時並出現鎖定超時錯誤。另外,如果您的交易是單一更新,您可以運行它,您不需要將其包含在交易中。如果你想使用多語句事務,你可能需要「可序列化」的隔離而不是MVCC,如果你將讀作爲事務的一部分:http://docs.tokutek.com/tokumx/tokumx-transactions.html#tokumx-transactions-isolation-serializable另外,你需要爲事務保留一個連接,或者連接池可能會使您的交易行爲不正確:http://docs.tokutek.com/tokumx/tokumx-transactions.html#tokumx-transactions-multi-statement-drivers

+0

感謝您回覆我。我明白你的意思,也許我問了這個問題。希望編輯將有助於澄清。再次感謝。 – Bainmeister

+0

對不起,我正在使用單個動作作爲一個簡單的例子。在工作代碼中,多個文檔被更新並且連接保持分離(每個insatance是一個mongoClient)。 我想比較兩種類型的事務以及他們如何執行不同的工作負載 - 所以在這種情況下,瞭解tokumx如何處理MVCC事務非常重要。我已經爲可序列化事務設置了測試,所以我對此感到滿意。謝謝你的幫助。 – Bainmeister

+0

您應該知道,如果您的交易是單一更新,您可以運行它,而無需將其包裝在交易中。如果你想使用多語句事務,你可能需要「可序列化」的隔離而不是MVCC,如果你將讀作爲事務的一部分:http://docs.tokutek.com/tokumx/tokumx-transactions .html #tokumx-transactions-isolation-serializable – leif