只能避免第二种情况,第一种情况无法避免,第一种情况即使使用JDBC,也无法解决,需要在数据库级做“锁”。
举个例子:
两个应用程序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的脏读脏写。
|
|