MySQL并发操作insert产生锁等待

环境描述:

操作系统:CentOS6.5

MySQL版本:5.7.12

事务隔离级别:READ-COMMITTED


实验过程:

1)表结构:

CREATE TABLE test.`saleorder` (
  `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `vendorId` BIGINT(20) UNSIGNED NOT NULL COMMENT '所属商家ID',
  `vendorName` VARCHAR(64) DEFAULT NULL COMMENT '商家名称',
  `posCode` VARCHAR(16) DEFAULT NULL COMMENT '销售点设备编码 例:pos机编码 手持编码',
  `orderStore` VARCHAR(16) NOT NULL COMMENT '订单归属门店',
  `orderStoreName` VARCHAR(64) DEFAULT NULL COMMENT '订单归属门店名称',
  `payStore` VARCHAR(16) DEFAULT NULL COMMENT '支付门店',
  `payStoreName` VARCHAR(64) DEFAULT NULL COMMENT '支付门店名称',
  `vipStore` VARCHAR(16) DEFAULT NULL COMMENT '会员绑定门店',
  `vipStoreName` VARCHAR(64) DEFAULT NULL COMMENT '会员归属门店名称',
  `srcStore` VARCHAR(16) DEFAULT NULL COMMENT '下单门店',
  `srcStoreName` VARCHAR(64) DEFAULT NULL COMMENT '下单门店名称',
  `srcVendorId` BIGINT(20) DEFAULT NULL,
  `srcVendorName` VARCHAR(64) DEFAULT NULL,
  `organCode` VARCHAR(16) DEFAULT NULL COMMENT '机构编码',
  `organName` VARCHAR(64) DEFAULT NULL COMMENT '机构名称',
  `openId` VARCHAR(64) DEFAULT NULL COMMENT '微信openId',
  `account` VARCHAR(64) DEFAULT NULL COMMENT '微信公众号',
  `orderNo` VARCHAR(32) DEFAULT NULL COMMENT '单据编号',
  `memberCode` VARCHAR(32) DEFAULT NULL COMMENT '会员卡号',
  `memberPin` VARCHAR(64) DEFAULT NULL COMMENT '会员用户名 系统登录名',
  `memberPhone` VARCHAR(16) DEFAULT NULL COMMENT '会员收集号',
  `parentMemPin` VARCHAR(64) DEFAULT NULL COMMENT '父级会员卡号',
  `orderAmount` DOUBLE(16,5) DEFAULT NULL COMMENT '订单总额优惠前的金额',
  `realPayAmount` DOUBLE(16,5) DEFAULT NULL COMMENT '客户实际支付的金额',
  `discount` DOUBLE(16,5) DEFAULT NULL COMMENT '整单折扣率',
  `smallChange` DOUBLE(16,5) DEFAULT NULL COMMENT '抹零',
  `specAmount` DOUBLE(16,5) DEFAULT NULL COMMENT 'special 优惠金额',
  `transFee` DOUBLE(16,5) DEFAULT NULL COMMENT '运费',
  `skuNum` DOUBLE(16,5) DEFAULT NULL COMMENT '商品总数多少库存单位商品',
  `kindNum` INT(10) UNSIGNED DEFAULT NULL COMMENT '商品样数,多少种商品',
  `integral` DOUBLE(16,5) DEFAULT NULL COMMENT '积分',
  `origNo` VARCHAR(32) DEFAULT NULL COMMENT '原单据号-针对退货单',
  `payOrganName` VARCHAR(64) DEFAULT NULL COMMENT '支付机构Name',
  `payOrganCode` VARCHAR(32) DEFAULT NULL COMMENT '支付机构',
  `srcOrganName` VARCHAR(64) DEFAULT NULL COMMENT '下单机构Name',
  `srcOrganCode` VARCHAR(32) DEFAULT NULL COMMENT '下单机构',
  `pickUpCode` VARCHAR(64) DEFAULT NULL COMMENT '提货码',
  `distributionType` TINYINT(4) DEFAULT NULL COMMENT '配送方式 0.在线配送 1.门店自提 ',
  `payMode` TINYINT(4) DEFAULT NULL COMMENT '支付模式 0.线上支付 1.门店支付 2.货到付款',
  `expressNo` VARCHAR(32) DEFAULT NULL COMMENT '快递单号',
  `expressName` VARCHAR(64) DEFAULT NULL COMMENT '快递名称',
  `expressPrintNum` INT(10) DEFAULT '0' COMMENT '打印快递单次数',
  `sendPrintNum` INT(10) DEFAULT '0' COMMENT '打印发货单次数',
  `payFlag` TINYINT(4) DEFAULT NULL COMMENT '支付结算状态 1已支付 0未支付',
  `distFlag` TINYINT(4) DEFAULT NULL COMMENT '是否返佣',
  `saleorder` TINYINT(4) DEFAULT NULL COMMENT '是否返佣',
  `saleMan` VARCHAR(32) DEFAULT NULL COMMENT '营业员',
  `saleManName` VARCHAR(64) DEFAULT NULL COMMENT '营业员名称',
  `cashier` VARCHAR(32) DEFAULT NULL COMMENT '收银员',
  `cashierName` VARCHAR(64) DEFAULT NULL COMMENT '收银员名称',
  `closeFlag` TINYINT(3) UNSIGNED DEFAULT NULL COMMENT '0-未结算 1已结算',
  `orderType` TINYINT(4) DEFAULT NULL COMMENT '订单类型 0零售单  1批发单 2积分兑换单 ,3 大于小铺,4商城 ,5微店',
  `orderStatus` TINYINT(4) DEFAULT NULL COMMENT '订单状态 0 已提交 1待发货  2已发货  3已 完成   4已取消',
  `confirmFlag` TINYINT(4) DEFAULT '1' COMMENT '是否已确认',
  `refund` TINYINT(4) DEFAULT '1' COMMENT '是否允许退货 1 允许 0 不允许',
  `orderFlag` TINYINT(4) DEFAULT NULL COMMENT '单据标记 0.销售单 1.退货单 2.退款单',
  `settleFlag` TINYINT(4) DEFAULT '0' COMMENT '结算标识',
  `source` TINYINT(3) UNSIGNED DEFAULT NULL COMMENT '订单来源 0-pos  1-微店  ',
  `uploadDate` DATETIME DEFAULT NULL COMMENT '订单上传到后台的时间',
  `thirdOrderNo` VARCHAR(32) DEFAULT NULL COMMENT '第三方订单号',
  `webPayNo` VARCHAR(64) DEFAULT NULL COMMENT '支付宝、微信支付码',
  `mediaSettleFlag` TINYINT(4) DEFAULT '0' COMMENT '传媒是否已结算 0未结算 1结算中 2已结算',
  `platformSettleFlag` TINYINT(4) DEFAULT '0' COMMENT '平台是否已结算 0未结算 1结算中 2已结算',
  `profitPrice` DOUBLE(16,5) DEFAULT NULL COMMENT '提成基准价',
  `brokerAmount` DOUBLE(16,5) DEFAULT NULL COMMENT '平台佣金总额',
  `memo` VARCHAR(64) DEFAULT NULL COMMENT '备注',
  `sellMemo` VARCHAR(64) DEFAULT NULL COMMENT '卖家备注',
  `version` INT(10) UNSIGNED DEFAULT '0' COMMENT '数据版本',
  `df` TINYINT(4) DEFAULT '0' COMMENT '是否已删除1删除 0正常',
  `createDate` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
  `modifyDate` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '修改日期',
  `finishDate` DATETIME DEFAULT NULL COMMENT '完成时间',
  `creator` VARCHAR(32) DEFAULT NULL COMMENT '记录创建人用户名',
  `mender` VARCHAR(32) DEFAULT NULL COMMENT '最后修改人用户名',
  `groupId` VARCHAR(32) DEFAULT NULL COMMENT '关联ID',
  `cardholder` VARCHAR(32) DEFAULT NULL COMMENT '信用卡持卡人',
  `cardID` VARCHAR(32) DEFAULT NULL COMMENT '信用卡号',
  `deliveryStatus` INT(4) DEFAULT NULL COMMENT '配送状态 0:已配送',
  `deliveryPerson` VARCHAR(25) DEFAULT NULL COMMENT '配送人',
  `deliveryPhone` VARCHAR(11) DEFAULT NULL COMMENT '配送人电话',
  `deliveryDate` DATETIME DEFAULT NULL COMMENT '配送人修改时间(可以更改多次,数据为最后一次修改记录时间)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_saleOrder_ids` (`vendorId`,`orderNo`) USING BTREE,
  KEY `idx_saleOrder_posCode` (`posCode`) USING BTREE,
  KEY `idx_saleOrder_orderStore` (`orderStore`) USING BTREE,
  KEY `order_no` (`orderNo`)
) ENGINE=INNODB AUTO_INCREMENT=7975600 DEFAULT CHARSET=utf8 COMMENT='销售单据表 只包括销售单 和退货单'

注意:

UNIQUE KEY `idx_saleOrder_ids` (`vendorId`,`orderNo`)

2)session1

begin;
insert into saleorder (vendorId,vendorName,srcVendorId, srcVendorName, brokerAmount, posCode,
      orderStore, orderStoreName,payStore,
      payStoreName, vipStore, vipStoreName,
      srcStore, srcStoreName, organCode, organName,
      srcOrganCode, srcOrganName, payOrganCode, payOrganName,
      openId,account, orderNo, memberCode, memberPin,
      memberPhone, parentMemPin, orderAmount, realPayAmount,
      discount, specAmount,smallChange, transFee, profitPrice,
      skuNum, kindNum, integral, 
      origNo,pickUpCode,expressName, expressNo, distributionType,
      payMode, payFlag, distFlag, saleMan,
      saleManName, cashier, cashierName, 
      closeFlag, orderType, orderFlag, settleFlag, orderStatus, confirmFlag,
      source, uploadDate, thirdOrderNo, webPayNo,
      memo, version, df, 
      createDate, modifyDate, finishDate, creator,
      mender,groupId,sellMemo,cardholder,cardID,deliveryPerson,deliveryStatus,deliveryPhone
       )
    values (81439,'掌合便利莲花山庄店', null,
      null,  null, '791377',
      '791377', '掌合便利莲花山庄店', '791377',
      '掌合便利莲花山庄店', null, null,
      '791377', '掌合便利莲花山庄店', '00101', '总部机构',
      '00101', '总部机构','00101', '总部机构',
      null, null, '7913771804061647550074',
      null, null,
      null, null, 4.0, 4.0,
      1.0, 0.0, null,null, null,
      2.0, 1, null, 
      null,null,null, null,
      1, null, 1, 0,
      null,null, 'hongyan', 'hongyan',
      null, 0, 0, 0,
      3, 1,
      0, '2018-04-06 16:54:07', null, null,
      null, 0, 0,
      '2018-04-06 16:47:56', '2018-04-06 16:47:56',null, 'hongyan',
      'hongyan',null,null,
      null,null,
      null,'0',null
       
      );

3) session2

begin;

insert into saleorder (vendorId,vendorName,srcVendorId, srcVendorName, brokerAmount, posCode,
      orderStore, orderStoreName,payStore,
      payStoreName, vipStore, vipStoreName,
      srcStore, srcStoreName, organCode, organName,
      srcOrganCode, srcOrganName, payOrganCode, payOrganName,
      openId,account, orderNo, memberCode, memberPin,
      memberPhone, parentMemPin, orderAmount, realPayAmount,
      discount, specAmount,smallChange, transFee, profitPrice,
      skuNum, kindNum, integral, 
      origNo,pickUpCode,expressName, expressNo, distributionType,
      payMode, payFlag, distFlag, saleMan,
      saleManName, cashier, cashierName, 
      closeFlag, orderType, orderFlag, settleFlag, orderStatus, confirmFlag,
      source, uploadDate, thirdOrderNo, webPayNo,
      memo, version, df, 
      createDate, modifyDate, finishDate, creator,
      mender,groupId,sellMemo,cardholder,cardID,deliveryPerson,deliveryStatus,deliveryPhone
       )
    values (81439,'掌合便利莲花山庄店', null,
      null,  null, '791377',
      '791377', '掌合便利莲花山庄店', '791377',
      '掌合便利莲花山庄店', null, null,
      '791377', '掌合便利莲花山庄店', '00101', '总部机构',
      '00101', '总部机构','00101', '总部机构',
      null, null, '7913771804061647550074',
      null, null,
      null, null, 4.0, 4.0,
      1.0, 0.0, null,null, null,
      2.0, 1, null, 
      null,null,null, null,
      1, null, 1, 0,
      null,null, 'hongyan', 'hongyan',
      null, 0, 0, 0,
      3, 1,
      0, '2018-04-06 16:54:07', null, null,
      null, 0, 0,
      '2018-04-06 16:47:56', '2018-04-06 16:47:56',null, 'hongyan',
      'hongyan',null,null,
      null,null,
      null,'0',null
       
      );

结果是session2处于锁等待过程,当session1提交或回滚事务后,session2的事务才会进行。

分析结果:

当需要进行唯一性冲突检测时,需要先加一个 S 锁。

session1的加锁过程如下:

insert 需要判断唯一性,检测到冲突,请求vendorId=81439的record lock(S)被阻塞,等待ing;
成功获取vendorId=81439=1的record lock(S);
请求vendorId=81439的record lock(X)锁;

session2的加锁过程:

需要判断唯一性,检测到冲突,请求vendorId=81439的record lock(S)被阻塞,等待ing,因为此时session1已经获得了vendorId=81439的X锁

参考文章:

http://www.sohu.com/a/169663059_610509

https://www.cnblogs.com/sunss/p/3166550.html


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值