背景:我们有一个分布式系统在多台机器上运行相同的Web应用程序。每台机器上的应用程序将数据传送到一个数据库(数据库是Oracle集群)。我们在这些Web应用程序服务器前面有一个负载均衡器(暂时忽略Web服务器)。
问题:我们有一个功能,例如购物车,将购物项目保存到客户的购物车中。代码应该是:
1: Load cart by Hibernate
2: if [Shopping item exists in Cart]
3: update quantity
else
4: add new cartItem
我们在这里遇到了并发问题。如果多个用户使用相同的客户帐户登录,并同时将购物项目添加到他们的购物车,则会出现重复的购物车项目。 因为Hibernate使用一级缓存(又称会话缓存),并且每个会话在事务开始时缓存数据。如果在步骤1和步骤之间完成了其他会话,则会话不知道其他会话在步骤2中添加了相同的购物项目。
我们暂时不使用二级缓存,因为它不会提高太多性能。尽管如此,二级缓存似乎并不是解决方案,因为Hibernate最初会读取First level catch。
之前有人解决过这类问题吗?