tidb版本:Server version: 5.7.25-TiDB-v5.0.6 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
表1
CREATE TABLE rdata
(
id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
mid
bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘ID’,
tid
bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ’ tID’,
key
varchar(64) NOT NULL DEFAULT ‘’ COMMENT ‘key’,
round
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘round’,
data
varchar(2048) NOT NULL DEFAULT ‘’ COMMENT ‘data’,
created_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
updated_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id
),
UNIQUE KEY uniq_mt_key_round
(mid
,tid
,key
,round
),
KEY idx_updated
(updated_at
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=39931000 COMMENT=‘表1’
CREATE TABLE m_data
(
id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
mid
bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘mID’,
tid
bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘tID’,
key
varchar(64) NOT NULL DEFAULT ‘’ COMMENT ‘key’,
round
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘round’,
rdata_id
bigint(20) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘rid’,
created_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
updated_at
timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
PRIMARY KEY (id
),
UNIQUE KEY uniq_mt_key_round
(mid
,tid
,key
,round
),
KEY idx_updated
(updated_at
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1 COMMENT=‘表2’
执行过程
表1里面已经有一条测试数据了
代码
`err = c.transactionDB.Transaction(func(tx *gorm.DB) error {
userTaskPO, userTaskRightPO, err = c.ReTX(ctx, tx, doo.DependTaskCompletedCount, memberTaskInfo, taskConfigData)
if err != nil {
log.Errorf(ctx, “ReTX %s err %v”, util.ToJson(us), err)
return err
}
return nil
})
func ReTX( ctx,tx,data)err {
// 表一插入 这里唯一索引冲突
db := tx.Table(data.TableName())
if err := tx.Create(data).Error; err != nil {
log.Errorf(ctx, “Insert xxxx err %v”, err)
return err
}
// 这里更新表2 规则是 如果唯一冲突就更新
db := tx.Table(data2.TableName())
if err := db.Clauses(clause.OnConflict{
Columns: clause.Column{{Name: “id”}, {Name: “tid”}, {Name: “key”}, {Name: “round”}},
DoUpdates: clause.AssignmentColumns(string{“r_data_id”}),
}).Create(&data2).Error; err != nil {
return err
}
return nil
}
`
最后的结果就是我说的:
表一有数据 表二没有
事务里面 表一插入的数据唯一索引冲突了 err 为空 下面的那边表也没有插入成功 。整个事务正常提交了。
后来我尝试对表一插入的时候加了
db.Clauses(clause.OnConflict{DoNothing: true}) 这个 grom的操作 表二的数据才正常写入