在这样的情况下,即将开发的B/S结构的系统里面可以使用Hibernate来实现持久化层吗?因为Hibernate也有自己的缓存,我在想如果两套系统同时访问的数据有交集时,会不会出问题啊?
1.你的系统(其中一个或两个)是否对数据实时性要求很高而你的数据又会经常被修改,如果是这样的话,会比较麻烦,因为Hibernate是可以通过乐观锁(或悲观锁,但这种方式会严重浪费数据库资源,一般不是很建议使用)来防止数据脏读脏写的问题,如果你的系统实时性要求很高需要使用乐观锁的话,由于两个系统不能使用同一个Hibernate上下文,这种情况使用乐观锁无法达到防止数据脏读脏写的目的。
2.你的系统(使用Hibernate那个)有没有使用Hibernate的二级缓存,如果有,还要看你使用二级缓存的策略,同样的道理,两个系统不能共享同一个Hibernate的二级缓存,至于一般的Hibernate的应用,只使用了一级缓存,即Hibernate Session期间的缓存,就不会有你锁担心的问题。
[该贴被johnnylzb于2008-02-25 10:18修改过]
这么问吧:
如果说我现在在B/S结构的那个系统里面只使用一级缓存,您说的这两种情况是不是就都可以避免了?
举个例子:
两个应用程序A、B同时修改帐户Account的余额Balance(注:以下事件按时间顺序发生):
A读取Acccout Banlace(balance=5000)
A执行修改: balance = balance - 1000 (balance=4000)
B读取Acccount Balance(balance=5000)
A提交结果(balance=4000)
B执行修改:balance = balance - 1000 (balance=4000)
B提交结果(balance=4000)
可以看到,实际上,Account被扣款两次共2000元,但实际上,B读取数据的时候是“脏读”,结果最后帐户还剩下4000余额,这是一个事务干扰的例子。假设应用B是B/S结构,使用了Hibernate(或者JDBC或其他),在B读取到修改提交这段时间,A对帐户余额的改变对B(即使Hibernate使用的是一级缓存)是透明的,从而导致了B的脏读脏写。
那么假定用户A、B都是在同一个C/S或者B/S结构的系统中,就能保证不出现脏读脏写了吗?
如果在C/S系统中,A和B同时读取了某条数据,然后A将其修改,那么B再次读取的时候,Hibernate应该是直接从缓存中读取吧,这样的话,B读到的是修改之前的数据了。这个问题会不会有呢,如何解决呀?