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/>一定要跟在

id后面,这样当clusterA启用BPrinter和clusterB启用CPrinter时,我们将对应的分支机构更新,所有的操作都在一个事务中进行,

此时如果clusterA提交事务成功,那么对应分支机构的vesion字段将自动加1,此时如果clusterB也提交那么将导致异常,

Hibernat会对比分支机构的version 字段,发现如果有变化那么抛出乐观锁异常,org.hibernate.StaleObjectStateException

2.2 clusterA和clusterB同时更新同一个分支机构下的打印机B和打印机C将他们的名称改为A,如果都提交成功,那么将导致存在同名的打印机

因此我们需要更新打印机时能够更新下分支机构的信息,这样保证只能有一个事务提交成功,另外一个事务抛出乐观锁异常。

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pspzg.html