美文网首页
mysql update操作,会不会有并发问题?

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

作者: 南岩飞雪 | 来源:发表于2019-08-27 18:13 被阅读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正常执行

    结论

      1. mysql update操作,不会有并发问题
        update操作加了锁:第一个update会持有这行记录的排它锁,第二个update需要持有这个记录的排它锁的才能对它进行修改;正常的话,第二个update会阻塞,直到第一个update提交成功或者回滚,它才会获得这个锁,从而对数据进行修改。
      1. 我们可以通过数据库的update进行余额加减操作,并且控制余额不会出现负值,因为我们用where语句限制了

    参考

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

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

    相关文章

      网友评论

          本文标题:mysql update操作,会不会有并发问题?

          本文链接:https://www.haomeiwen.com/subject/slgvjctx.html