模拟转账,并发情况下如何能保证数据的正确完整

snowboy8886 2015-01-30 12:07:44
有如下case
用户A有5000元,用户B,用户C同时给用户A转账,譬如B转1000,C转2000。因为是同时,就可能出现并发,数据库如何操作才能保证数据的正确?
...全文
466 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2015-01-30
  • 打赏
  • 举报
回复
事务的方式提交,处理时会将相关的数据加锁,这期间其他用户或进程是无法修改这些记录的,直到本事务提交或回退,释放锁之后
snowboy8886 2015-01-30
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
事务的方式提交,处理时会将相关的数据加锁,这期间其他用户或进程是无法修改这些记录的,直到本事务提交或回退,释放锁之后
将事物的隔离级别设置为Serializable?
snowboy8886 2015-01-30
  • 打赏
  • 举报
回复
引用 2 楼 wenyzh 的回复:
并发的时候,除了用事务控制外,也可以在表里加个标示记录状态的字段,比如status default 0。 update 记录的时候先判断 status ,如果 status = 0 ,则可以进行修改的过程,分如下步骤: 1. 更新status = 1; 2. 转账业务更新表 3: 更新status = 0; update 记录的时候如果status = 1 ,则需要延时等待(dbms_lock.sleep(n)) ,然后再判断 status 直到status = 0 才可以象上面一样操作。
如果只是判断status == 0, 还是会出现并发可能多个线程都读到是0的情况啊
  • 打赏
  • 举报
回复
并发的时候,除了用事务控制外,也可以在表里加个标示记录状态的字段,比如status default 0。 update 记录的时候先判断 status ,如果 status = 0 ,则可以进行修改的过程,分如下步骤: 1. 更新status = 1; 2. 转账业务更新表 3: 更新status = 0; update 记录的时候如果status = 1 ,则需要延时等待(dbms_lock.sleep(n)) ,然后再判断 status 直到status = 0 才可以象上面一样操作。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧