如何在多服务器结构下处理hibernate一级缓存造成的不同步
问题描述:
现有一大并发量连续买卖操作涉及到帐务的收支记录,帐务操作分为入账和出账两种。
某个时间段某位用户的10笔帐务流水记录如下:
发生时间 入账/出账 发生金额 之前帐户余额 之后帐户余额
1 2008-1-12 8:19 2 1 50.7 49.7
2 2008-1-12 8:19 2 1 49.7 48.7
3 2008-1-12 8:19 2 1 48.7 47.7
4 2008-1-12 8:20 2 1 47.7 46.7
5 2008-1-12 8:20 2 1 46.7 45.7
6 2008-1-12 8:20 2 1 45.7 44.7
7 2008-1-12 8:20 1 10 44.7 54.7
8 2008-1-12 8:21 2 1 48.7 47.7
9 2008-1-12 8:21 2 1 47.7 46.7
10 2008-1-12 8:51 2 1 46.7 45.7
*在上表记录中2为出账,1为入账。
上面第8笔交易出现了帐户余额错误,其“之前帐户余额”应为54.7。
所有交易的帐户余额都是在事务处理过程中由帐户接口内部查询出来的,与外部用户操作无关,与用户相关的只有发生金额;
且用户在这些交易过程中没有其它任何涉及到帐户余额改变的操作,即便有也会在流水帐数据上体现出来。
问题产生原因分析:
网站采用多服务器(>10台)+负载平衡设备,用户每次的request都由负载平衡设备随机分配到某台服务器。
数据操作采用了hibernate组件,没有开启lazy。怀疑造成该问题原因是hibernate一级缓存的被动更新方式。
从上表数据可看出,第2笔交易后余额为48.7(假设该笔交易被负载平衡分配到服务器1),因此推断3-7笔交易不是在服务器1上进行的,从而导致第8笔交易被分配服务器1上时,由于连续交易间隔时间短,读取了没有及时更新的hibernate缓存数据(get方法获取)。
问:如何在多服务器结构下处理各个服务器hibernate数据一级缓存同步?
如果实在不行只能不使用hibernate了。
------解决方案--------------------挺复杂啊。。。丁页。。。学习ing........
------解决方案--------------------up
------解决方案--------------------关注中,建议参考下孙卫琴精通Hibernate中对事务处理的那部分,以前大概看过两眼,跟你问的好像有关,没细研究。
------解决方案--------------------这个需要分布式的事务处理。
------解决方案--------------------
1 采用乐观锁,此方法修改最少,但可能某些事务会提交失败
2 修改你的代码,在事务中锁定数据库的数据,行,多行甚至表, 也就是悲观锁
3 Hibernate采用 ehCache, 配置 ehcache的分布式属性。 推荐
------解决方案--------------------
个人认为分布式事务和这个没有关系,如果你的事务需要跨多个数据库服务器,倒是可以考虑。
其实乐观锁挺好的,就是每个数据加上一个版本啦,更新的时候hibernate会自动校验的
Version 就是这个。
具体的去搜索吧!
------解决方案--------------------
我不太清楚lz的database server是不是多台。
具体可以参考下面的链接:http://www.hibernate.org/201.html
引用:To get a free distributed cache for your Hibernate database integration, all you need to do is replace your existing Hibernate cache provider, typically EhCache, with the free GigaSpaces Community Edition, in 6 easy steps.
------解决方案--------------------学习
------解决方案--------------------占个位置
------解决方案--------------------
GigaSpaces的Master-Local Cache Topology应该可以实现你的功能。。