gpt4 book ai didi

java - Java 中的 TokuMX MVCC 事务

转载 作者:行者123 更新时间:2023-12-02 05:38:53 26 4
gpt4 key购买 nike

在同一文档上运行并发事务时,如何保存高度竞争的记录?

这似乎正在发生:

  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 的预期行为(或者我做错了什么)?

最佳答案

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

关于java - Java 中的 TokuMX MVCC 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24699070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com