在同一文档上运行并发事务时,如何保存高度竞争的记录?
这种情况似乎正在发生:
下面是示例代码:
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的故意行为(或者我做错了什么)?
发布于 2014-07-11 15:15:41
TokuMX多语句事务与MySQL多语句事务非常相似.在您的示例中,在更新过程中将持有文档级别的锁,因此对该记录的更新将被序列化。
如果由于两个事务同时更新同一个文档而发生冲突,则update方法将返回一个错误,说明存在锁冲突。
为了帮助您理解所发生的事情,请让两个线程运行这个线程,但两者都没有提交。您将看到一个线程等待,并最终通过锁定超时错误超时。
另外,如果您的事务是一个单独的更新,您可以只运行它,您不需要将它包装在一个事务中。如果您想使用多语句事务,则可能需要“可序列化”的隔离,而不是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。
https://stackoverflow.com/questions/24699070
复制相似问题