数据库的事物是为了保证几条sql能同时执行成功,如果其中一部分产生错误会回滚操作。保证数据的安全。
但是现在的系统数据层已经不只是依靠数据库来处理数据了,往往会加入缓存系统。对数据的处理产生了干扰,已经不全由数据库来决定了。
例如:
public void addGold(User user1,User user2,int gold){ user1.setGold(user1.getGold+gold); user2.setGold(user2.getGold-gold); dao.updateUser(user1); dao.updateUser(user2); }
采用事物是能保证这个业务不会出错。
但是现在大部分 系统都会用aop的方式在updateUser上加入缓存操作。而不是手动控制update
所以updateUser的时候在修改数据库之前其实已经修改了缓存里面的值。也就是说事物控制不了数值的正确性了。出现问题也没办法回滚。
这确实是一个复杂的问题,因为数据出现在缓存系统和数据库系统两个地方。 数据库系统就算有事物可以回滚,但是不会影响到缓存系统里面的数据。也就是说就算数据库操作正常,在缓存的时候有可能出错导致缓存的数据与数据库数据不一致的问题。
针对这个问题,当然也是有解决办法的。就是对业务数据针对的处理。重要数据不仅仅要确保数据库里面能回滚。缓存系统也要能同步回滚。两者同时操作成功否则同时回滚。
而对于大部分其他一般的业务,数据库的事物作用已经名存实亡了。