如何实现一个高并发的余额交易服务

实现高并发余额交易:
每笔交易包含唯一的交易 ID、源账户号码、目标账户号码、交易金额和时间戳。
每笔交易需要更新源账户和目标账户的余额
需要保证数据一致性,并且支持高并发

方案1:悲观锁,使用select for update 锁住单行
begin
select balance ,version from account where id=? for update //读源账户,加锁直到事务结束
select balance ,version from account where id=? for update //读目标账户
balance = balance +amount //计算更新后的值
update account set balance = ? where id= ? //更新源账户
update account set balance = ? where id= ? //更新目标
commit //成功提交,失败回滚

方案2: 乐观锁
在账户表里加一个version字段,每次更新检查版本号
begin
select balance ,version from account where id=? //读源账户
select balance ,version from account where id=? //读目标账户
balance = balance +amount //计算更新后的值
update account set balance = ? version= ? where id= ? and version=? //更新源账户
update account set balance = ? version= ? where id= ? and version=? //更新目标
commit //成功提交,失败回滚
这里由于需要更新2个账号,所以还是需要事务,没有做到真正乐观

方案3:
begin
update account set balance =balance -? where id=x and balance >? //更新源账户
update account set balance =balance +? where id=x //更新目标
检查如果更新失败就回滚
commit

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容