在同一文檔上運行併發事務時,如何保存高度爭用的記錄?Java中的TokuMX MVCC事務
看來,這種情況正在發生:
- MVCC事務A開始。
- MVCC事務B開始。
- 交易A更新docA和docB。
- 事務A提交。
- 事務B更新docA和docC - 由於事務A已經提交併且不保留鎖,因此獲取鎖。
- 事務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的預期行爲(或者我做錯了什麼)?
感謝您回覆我。我明白你的意思,也許我問了這個問題。希望編輯將有助於澄清。再次感謝。 – Bainmeister
對不起,我正在使用單個動作作爲一個簡單的例子。在工作代碼中,多個文檔被更新並且連接保持分離(每個insatance是一個mongoClient)。 我想比較兩種類型的事務以及他們如何執行不同的工作負載 - 所以在這種情況下,瞭解tokumx如何處理MVCC事務非常重要。我已經爲可序列化事務設置了測試,所以我對此感到滿意。謝謝你的幫助。 – Bainmeister
您應該知道,如果您的交易是單一更新,您可以運行它,而無需將其包裝在交易中。如果你想使用多語句事務,你可能需要「可序列化」的隔離而不是MVCC,如果你將讀作爲事務的一部分:http://docs.tokutek.com/tokumx/tokumx-transactions .html #tokumx-transactions-isolation-serializable – leif