为了账号安全,请及时绑定邮箱和手机立即绑定

请教,mysql事务,锁和交易问题?

请教,mysql事务,锁和交易问题?

泛舟湖上清波郎朗 2019-03-01 10:53:15
比如账户余额有100块钱,交易时检测如果 余额大于交易额,就交易成功。现在假设这个用户同一时刻,产生了多比交易,检测的时候就会出现问题。 问题: 请问这个时候用事务的SERIERLIZED 隔离级别是否可以解决此问题。 或者给这行数据加锁,那请问这个锁该怎么加?
查看完整描述

5 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

用乐观锁解决此问题,就像楼上说的,如果这样操作的话,容易出现过多的乐观锁异常,需要自己手动进行对乐观锁异常进行补偿,来更新数据。
这样的问题最好还是在业务逻辑层次来进行处理,例如:如果是批量操作的,可以对账户进行汇总更新,或者通过同步队列来进行处理,但是这样对性能方面都会有所影响,主要还是得具体的业务场景和系统要求

查看完整回答
反对 回复 2019-03-01
?
四季花海

TA贡献1811条经验 获得超5个赞

  1. 可以解决此问题,但是可能性能会急剧下降

  2. 可以加乐观锁啊

查看完整回答
反对 回复 2019-03-01
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

理论上是可以解决问题的。但是如果从数据库层面修改事务隔离级别为SERIERLIZED对所有依赖这个数据库的系统是一场灾难。所有的数据库事务都变成了串行,系统基本上就趴窝了。

编码层面使用乐观锁可以提高性能,但是乐观锁的缺点是不适用与写操作较多的情况,因为频繁的发现无法更新数据,应用系统会不停的retry,导致应用系统压力越来越大,占用cpu资源,影响应用系统。

要看当时的业务场景具体分析,需要在整体架构上,思考如何解决问题。

查看完整回答
反对 回复 2019-03-01
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

典型的乐观锁场景,通过在写入时判断条件匹配情况,而不是在一开始就进行同步阻塞。

sql 演示:

update order set price=price-100 where id = 1 and price >= 100

对于有 ABA 问题的,也可以通过添加 version 来解决。

SERIERLIZED 采用的是悲观锁,性能会有损失。

查看完整回答
反对 回复 2019-03-01
  • 5 回答
  • 0 关注
  • 459 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信