首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java中的TokuMX MVCC事务

Java中的TokuMX MVCC事务
EN

Stack Overflow用户
提问于 2014-07-11 13:35:46
回答 1查看 830关注 0票数 0

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

这种情况似乎正在发生:

  1. MVCC事务A开始。
  2. MVCC事务B开始。
  3. 事务A更新docA和docB。
  4. 事务A提交。
  5. 事务B更新、docA和docC锁是在事务A提交且不持有锁时获得的。
  6. 事务B提交覆盖工作转换A在docA上完成的工作。

下面是示例代码:

代码语言:javascript
复制
        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的故意行为(或者我做错了什么)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24699070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档