在集群设计和开发过程中,我们必须要考虑并发问题。常见的主要涉及到添加,更新,删除。
涉及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、删除,需要考虑捕获记录不存在异常。