Play框架中的交易

北极

我正在使用DB和anorm进行游戏,我有一些非常常见的方法,例如:

def insert(user: User) = {
 DB.withConnection { implicit connection =>
  SQL"""
      insert into user(email, password) values (
       ${user.email}, ${user.password}
      )
    """
    .executeInsert()
  }
}

def insert(notification: Notification) = {
   DB.withConnection { implicit connection =>
    SQL"""
      insert into notification(date, text) values (
       ${notification.date}, ${notification.text}
      )
    """
    .executeInsert()
  }
}

因此,我有2种使用自动提交连接的方法。我要写的是这样的东西,即创建用户,创建通知,并有机会在出现错误的情况下回滚所有内容:

def createUserAndSendNotification(user:User) = {
 DB.withTransaction {
   insert(user)
   insert(new Notification)
  }
}

,但是方法insert(user)和insert(notification)方法已经设置了autocommit = 1,因此,如果通知插入失败,则user仍将保留。

我可以在createUserAndSendNotification(user:User)中编写普通的SQL,但是我会使用现有的方法,例如insert(user)和insert(notification)。是否有可能?

PS1

可能的解决方案-为事务块中使用的每种方法制作辅助方法:

def insert(notification: Notification) = {
 DB.withConnection { implicit connection =>
   insertSql(notification)
  }
}

def insertSql(notification: Notification)(implicit connection: Connection) = {
 SQL"""
      insert into notification(date, text) values (
       ${notification.date}, ${notification.text}
      )
    """.executeInsert[Option[Long]]()
}

所以:

def createUserAndSendNotification(user:User) = {
 DB.withTransaction {implicit connection =>
   insertSql(user)
   insertSql(new Notification)
  }
}
史蒂夫·沃尔德曼

尝试将Connection作为隐式参数提供给您的细粒度函数,并且仅在DB.withTransaction以下位置获取一次Connection

def insert(user: User)(implicit connection: Connection) = {
  SQL"""
      insert into user(email, password) values (
       ${user.email}, ${user.password}
      )
    """
    .executeInsert()
}

def insert(notification: Notification)(implicit connection: Connection) = {
    SQL"""
      insert into notification(date, text) values (
       ${notification.date}, ${notification.text}
      )
    """
    .executeInsert()
}

def createUserAndSendNotification(user:User) = {
 DB.withTransaction { implicit connection =>
   insert(user)
   insert(new Notification)
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章