mysql update操作,会不会有并发问题?

2019-08-27  本文已影响0人  南岩飞雪

问题

对余额进行加减操作,会不会有并发问题?

测试

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.png

3.3 commit 或者 rollback 第一个窗口的sql,第二个窗口的sql正常执行

结论

参考

MYSQL-Innodb下,update的并发是否会产生脏数据?

事务的4个特性——ACID(原子性、一致性、隔离性和持久性)、更新丢失问题

上一篇 下一篇

猜你喜欢

热点阅读