[英]how can we handle concurrent transactions in hibernate
我们实现了一个multi threaded
应用程序,用于更新数据库中表的列
即用户帐户余额 。 休眠用于将我们的应用程序与数据库进行交互。 该应用程序部署在多台服务器中 ,并将作为集群工作 。
假设发送了多个请求以更新数据库中的同一用户帐户。 我们如何处理这种情况? 来自多个服务器或来自同一服务器的不同线程的请求将尝试同时更新此请求。 如何确保操作的原子性。 我们可以使用Hibernate或Spring框架通过数据库表锁定或行级锁定来做同样的事情吗
范例 :
thread A
从server S1
和thread B
从server S2
访问相同的record R
在同一时间 。
首先,来自server S1
的thread A
将R
的值更新为R1
并commit
transaction
。
同时,来自server S2
的thread B
将R
的值更新为R2
并commit
transaction
。
这种情况的结果是什么? 我们必须锁定一项交易才能获得正确的结果?。 我们如何锁定交易,因为它来自不同的服务器?
您可以使用Hibernate乐观锁定。
乐观锁定假设多个事务可以完成而不会互相影响,因此事务可以继续进行而不会锁定它们影响的数据资源。 在提交之前,每个事务都将验证没有其他事务已修改其数据。 如果检查显示有冲突的修改,则提交的事务将回滚[1]。
此处提供更多信息: https : //docs.jboss.org/hibernate/orm/4.0/devguide/zh-CN/html/ch05.html
对于您提到的方案,您需要考虑以下几点:
设置事务隔离级别。 请参考此链接以设置事务隔离级别。 在大多数情况下, READ COMMITTED
足以满足要求,但您也可以探索其他选项。
如果您有像JMS这样的多个事务资源,请考虑使用XA事务。 即在您的配置中,您可以使用XA投诉数据库驱动程序。 请参阅此链接以获取更多详细信息 。 XA驱动程序提供了两阶段提交协议,该协议可保持事务的原子性。
如果您有EJB,那么container managed transaction
可以为您完成所有与事务相关的工作。 请参阅此链接以获取更多信息 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.