我正在使用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] 删除。
我来说两句