Hibernate在集群中应用

在集群设计和开发过程中,我们必须要考虑并发问题。常见的主要涉及到添加,更新,删除。

涉及Oracle数据库,hibernate乐观锁,唯一性约束,事务,mvc

下面针对上述操作举例说明如何考虑并发问题和hibernate的使用方式:

我们首先要了解一个需求,在所有时刻在一个分支机构下只能有一个打印机是可以使用的,而且打印机名称不能重复

1、添加:

如果clusterA和clusterB同时在同一个分支机构下添加一个相同的打印机并启用,那么有可能会出现添加同名的打印机,
此时我们要将数据库中打印机表的名称字段设置为唯一性约束。
当clusterA提交事务成功后,如果clusterB提交事务,那么将抛出唯一性约束异常,在hibernate中对应的为ConstrainVolidateException,
我们需要捕获该异常记录 日志并抛出,我们在v层一般在action中捕获并给出用户友好提示。

2、更新

2.1 现在A机构下存在一个启用的打印机APrinter,那么如果clusterA和clusterB同时启用BPrinter和CPrinter,
执行步骤为停用APrinter,并启用BPrinter和CPrinter这样可能会出现BPrinter和CPrinter同时被启用,那么我们如何规避
此时我们可以考虑采用Hibernate的乐观锁机制,在分支机构表和打印机表中加入一个version字段,
并在hibernat的hbm文件中配置<version name="version"/>一定要跟在
id后面,这样当clusterA启用BPrinter和clusterB启用CPrinter时,我们将对应的分支机构更新,所有的操作都在一个事务中进行,
此时如果clusterA提交事务成功,那么对应分支机构的vesion字段将自动加1,此时如果clusterB也提交那么将导致异常,
Hibernat会对比分支机构的version 字段,发现如果有变化那么抛出乐观锁异常,org.hibernate.StaleObjectStateException

2.2 clusterA和clusterB同时更新同一个分支机构下的打印机B和打印机C将他们的名称改为A,如果都提交成功,那么将导致存在同名的打印机
因此我们需要更新打印机时能够更新下分支机构的信息,这样保证只能有一个事务提交成功,另外一个事务抛出乐观锁异常。

3、删除,需要考虑捕获记录不存在异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值