实现高并发余额交易:
每笔交易包含唯一的交易 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