两个人同时到银行取钱问题?
延迟照成
一个人现在余额180块钱,然后他用180块钱就买东西,同时又去充值500块钱,买东西的时候查询余额先查询出来了余额是180,这个时候充值冲进去了500,然后他买了东西,更新了余额,余额变成0;
我以为这辈子差不多不会遇到了,真遇到了,说一下问题原因,我们知道数据库事务由严格的定义,它必须满足4个特性:
原子性(Atomicity),一致性(consistency),隔离性(Isolation),持久性(Durability)。
而我这里是因为没有满足原子性:也就是
表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。事务中的任何一个数据库操作失败,已经执行的任何操作都必须被撤销,让数据库返回初始状态。
解决办法
1. update table set money = money+500,千万别这样写update table set money = 800
2.可以校验数据时效性,主要用于金融行业:
比如加个字段 lastupdatetime 每次更新都更新这个时间
你update的时候加个条件,你query出来的时间必须等于数据库里这个字段的时间,
否则不更新,提示数据已失效,这里必须保证数据查询时间不会太慢。否则时间肯定不一致
网友评论