问题
对余额进行加减操作,会不会有并发问题?
测试
1. 建表
CREATE TABLE `xxx_sms_balance` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
`corp_id` varchar(64) NOT NULL COMMENT '企业id',
`balance` int(9) NOT NULL DEFAULT 0 COMMENT '剩余总数量',
`expired_time` datetime NOT NULL COMMENT '过期时间',
`app` tinyint(1) NOT NULL COMMENT '应用类型',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_corp_app` (`corp_id`, `app`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信余额';
2. 插入一条数据
Insert into xxx_sms_balance(corp_id,balance,expired_time,app) Values ('shao', 1000, now(), 1);
3. 关闭自动提交,模拟并发,打开两个会话窗口
3.1 第一个窗口执行
set AUTOCOMMIT = 0;
BEGIN;
update payslip_sms_balance set balance = balance - 600, expired_time = now() where corp_id = 'shao' and app = 1 and balance >= 600;
3.2 第二个窗口执行相同的sql,这时候sql执行阻塞了
image.png3.3 commit 或者 rollback 第一个窗口的sql,第二个窗口的sql正常执行
结论
- mysql update操作,不会有并发问题
update操作加了锁:第一个update会持有这行记录的排它锁,第二个update需要持有这个记录的排它锁的才能对它进行修改;正常的话,第二个update会阻塞,直到第一个update提交成功或者回滚,它才会获得这个锁,从而对数据进行修改。
- mysql update操作,不会有并发问题
- 我们可以通过数据库的update进行余额加减操作,并且控制余额不会出现负值,因为我们用where语句限制了
网友评论