Grails中记录并发访问时出现异常

 

   按客户需求,昨天我们的程序从dropbox上获取内容,dropbox的目录遍历耗时长,从日志看有的账户需要30多秒。

如是前一次请求没有结束,后一次请求又来了,两次请求同时操作一条记录时,出现如下错误:

 

 

[ERROR] api Exception: Object of class [com.friendmedia.commercial.Screen] with identifier [55]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.friendmedia.commercial.Screen#55]

 

 

通过寻找资料得知,这是hiberate自己做的优化,默认给记录加了乐观锁,写入时发现数据库中version的版本和缓存的不一致时,会抛出以上异常。

 

可以通过如下办法解决:

Screen screen = Screen.findByMac('00-0d-a8-80-21-ee', [lock: true]);
screen.program = (program as JSON).toString();
screen.save(flush: true);

 

 

这里给记录加上了一个悲观锁,在操作记录时不允许别人读,update操作执行完后,锁将释放。更多详情:

http://grails.org/doc/2.0.x/guide/single.html#locking

你可能感兴趣的:(grails)