比如账户余额有100块钱,交易时检测如果 余额大于交易额,就交易成功。现在假设这个用户同一时刻,产生了多比交易,检测的时候就会出现问题。
问题:
请问这个时候用事务的SERIERLIZED 隔离级别是否可以解决此问题。
或者给这行数据加锁,那请问这个锁该怎么加?
5 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
用乐观锁解决此问题,就像楼上说的,如果这样操作的话,容易出现过多的乐观锁异常,需要自己手动进行对乐观锁异常进行补偿,来更新数据。
这样的问题最好还是在业务逻辑层次来进行处理,例如:如果是批量操作的,可以对账户进行汇总更新,或者通过同步队列来进行处理,但是这样对性能方面都会有所影响,主要还是得具体的业务场景和系统要求
沧海一幻觉
TA贡献1824条经验 获得超5个赞
理论上是可以解决问题的。但是如果从数据库层面修改事务隔离级别为SERIERLIZED对所有依赖这个数据库的系统是一场灾难。所有的数据库事务都变成了串行,系统基本上就趴窝了。
编码层面使用乐观锁可以提高性能,但是乐观锁的缺点是不适用与写操作较多的情况,因为频繁的发现无法更新数据,应用系统会不停的retry,导致应用系统压力越来越大,占用cpu资源,影响应用系统。
要看当时的业务场景具体分析,需要在整体架构上,思考如何解决问题。
汪汪一只猫
TA贡献1898条经验 获得超8个赞
典型的乐观锁场景,通过在写入时判断条件匹配情况,而不是在一开始就进行同步阻塞。
sql 演示:
update order set price=price-100 where id = 1 and price >= 100
对于有 ABA 问题的,也可以通过添加 version 来解决。
SERIERLIZED 采用的是悲观锁,性能会有损失。
添加回答
举报
0/150
提交
取消