在同一文档上运行并发事务时如何保存高度竞争的记录?
似乎正在发生这种情况:
- 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 的预期行为(或者我做错了什么)?