我有一个服务器功能,很多客户端都在同一时间多次调用它。服务器功能执行以下操作:
当两个或多个客户端同时运行该函数,并且多个x对象被添加到数据库中时,这会出错。
我只是通过使用执行上述操作的同步方法创建一个单例管理器类来解决此问题。
效果很好,因为现在该功能一次只能由一个客户端调用。 (但是当有2台服务器时,我确实遇到了问题,但是还不是这样)
但是我想知道是否有更好的方法用jpa解决此问题?
最佳答案
是的,整个操作应在事务内执行,例如JTA或Spring的@Transactional
提供的事务。如果事务在适当的级别被隔离(我认为在这种情况下为REPEATABLE_READ
),则底层的持久性系统将通过阻止一个事务直到另一事务完成来确保不会发生冲突的写操作(实质上是synchronized
在Java中所做的事情) ,或者在检测到冲突时停止并回滚第二个事务(然后可以重试)。