首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >com.scalar.db.exception.storage.NoMutationException:未应用任何突变。使用ScalarDB时出错

com.scalar.db.exception.storage.NoMutationException:未应用任何突变。使用ScalarDB时出错
EN

Stack Overflow用户
提问于 2020-07-21 04:59:48
回答 1查看 29关注 0票数 0

这个问题是关于标量DB (https://github.com/scalar-labs/scalardb)的。

下面的代码告诉com.scalar.db.exception.storage.NoMutationException: no mutation was applied.是什么导致了这个错误,我该如何修复它?

代码语言:javascript
复制
  def updateConfirmedStatusAndDeleteToken(user:User,token:UserToken) = Future {
    val transaction: DistributedTransaction = transactionService.start
    logger.trace("transaction started: " + transaction);
    //Perform the operations you want to group in the transaction

    val pUserKey = new Key(new IntValue("bucket", utilities.bucketIDFromEmail(user.profile.externalProfileDetails.email)),
      new TextValue("email", user.profile.externalProfileDetails.email)
    )
    val cUserKey = new Key(
      new TextValue("authprovider", "credentials"),
      new TextValue("firstname", user.profile.externalProfileDetails.firstName),
      new TextValue("lastname", user.profile.externalProfileDetails.lastName)
    )
    logger.trace("created keys. ")
    val putUser: Put = new Put(pUserKey, cUserKey)
      .forNamespace("cj")
      .forTable("users")
      .withValue(new BooleanValue("confirmed", true))

    logger.trace(s"putting user with confirmed status ${putUser}")
    transaction.put(putUser)
    logger.trace(s"reading token before deleting")
    val pGetToken = new Key(new TextValue("token_id",token.tokenId.toString))
    val getToken:Get = new Get(pGetToken)
      .forNamespace("cj")
      .forTable("user_authentication_token")

    transaction.get(getToken)

    logger.trace(s"deleting token. Preparing keys using ${token}, ${token.tokenId.toString}")
    val pDeleteTokenKey = new Key(new TextValue("token_id",token.tokenId.toString))
    logger.trace(s"delete key is ${pDeleteTokenKey}")
    val deleteToken:Delete = new Delete(pDeleteTokenKey)
      .forNamespace("cj")
      .forTable("user_authentication_token")

    transaction.delete(deleteToken)

    try{
      logger.trace(s"committing")
      transaction.commit()
    } catch {
      case e1:UnknownTransactionStatusException =>{
        logger.error("error in commiting. Unknowns status")
        throw e1;

      }
      case e2:CommitException =>{
        logger.error("error in commiting. Rolling back")
        transaction.abort();
        throw e2;
      }
    }
  }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 14:41:44

问题出在我使用DistributedTransaction的时候。我为创建了单独的DistributedTransaction实例,而不是跨不同的db操作使用单个实例。我在updateConfirmedStatusAndDeleteToken中创建了一个,但在其他操作中也同样创建了新的。现在,我从顶层传递实例,以便所有操作都使用相同的实例。

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

https://stackoverflow.com/questions/63003713

复制
相关文章

相似问题

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