我的grails应用程序中有starnge场景,每当不同的用户同时下订单并且相同的菜单被更新时,它会抛出一个乐观的锁定异常,现在它就像这样
def orderApi {
// credits are deducted before try catch
// code
// .....
try {
// code to place order
}
catch(Exception e){
// send mail for exception
orderFailed = true
}
if(orderFailed){
refundUserCredits(order)
}
}
def refunduserCredits(Order order){
User user = order.user
user.credits = order.credits
if(!user.save()){
println "Unable to save user" // but it does not save the credits
}
}
我猜是因为我抓住了异常,并退还了积分并保存了用户对象,它应该保存它们。另外奇怪的是,如果不保存用户信用,它应该进来!user.save()并打印消息,但它甚至没有那样做。帮助!
答案 0 :(得分:0)
我认为您使用transaction会受益。它允许您将订单放置和信用扣除捆绑在一起作为一个全有或全无单元。现在,您正在实施自己的事务管理。它会像这样......
Order.withTransaction { status ->
// deduce credits and attempt to place order. save() all you want.
if(orderFailed) status.setRollbackOnly()
}
因此,只有一切顺利,订单和用户更改才会保留。