@@ -223,10 +223,18 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error {
223
223
fkc .stats = & FKCheckRuntimeStats {}
224
224
defer fkc .ctx .GetSessionVars ().StmtCtx .RuntimeStatsColl .RegisterStats (fkc .ID (), fkc .stats )
225
225
}
226
+ start := time .Now ()
226
227
if len (fkc .toBeCheckedKeys ) == 0 && len (fkc .toBeCheckedPrefixKeys ) == 0 {
227
- return nil
228
+ // It's possible that the `toBeLockedKeys` is not empty. Because the `INSERT IGNORE` will use
229
+ // `checkRows` to check each row, which doesn't need this function to check the rows again, but
230
+ // it still needs to lock the rows.
231
+ err := fkc .doLock (ctx )
232
+ if fkc .stats != nil {
233
+ fkc .stats .Lock = time .Since (start )
234
+ }
235
+
236
+ return err
228
237
}
229
- start := time .Now ()
230
238
if fkc .stats != nil {
231
239
defer func () {
232
240
fkc .stats .Keys = len (fkc .toBeCheckedKeys ) + len (fkc .toBeCheckedPrefixKeys )
@@ -248,6 +256,15 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error {
248
256
if fkc .stats != nil {
249
257
fkc .stats .Check = time .Since (start )
250
258
}
259
+
260
+ err = fkc .doLock (ctx )
261
+ if fkc .stats != nil {
262
+ fkc .stats .Lock = time .Since (start ) - fkc .stats .Check
263
+ }
264
+ return err
265
+ }
266
+
267
+ func (fkc * FKCheckExec ) doLock (ctx context.Context ) error {
251
268
if len (fkc .toBeLockedKeys ) == 0 {
252
269
return nil
253
270
}
@@ -263,9 +280,6 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error {
263
280
// doLockKeys may set TxnCtx.ForUpdate to 1, then if the lock meet write conflict, TiDB can't retry for update.
264
281
// So reset TxnCtx.ForUpdate to 0 then can be retry if meet write conflict.
265
282
atomic .StoreUint32 (& sessVars .TxnCtx .ForUpdate , forUpdate )
266
- if fkc .stats != nil {
267
- fkc .stats .Lock = time .Since (start ) - fkc .stats .Check
268
- }
269
283
return err
270
284
}
271
285
@@ -542,7 +556,7 @@ type fkCheckKey struct {
542
556
isPrefix bool
543
557
}
544
558
545
- func (fkc FKCheckExec ) checkRows (ctx context.Context , sc * stmtctx.StatementContext , txn kv.Transaction , rows []toBeCheckedRow ) error {
559
+ func (fkc * FKCheckExec ) checkRows (ctx context.Context , sc * stmtctx.StatementContext , txn kv.Transaction , rows []toBeCheckedRow ) error {
546
560
if fkc .ctx .GetSessionVars ().StmtCtx .RuntimeStatsColl != nil {
547
561
fkc .stats = & FKCheckRuntimeStats {}
548
562
defer fkc .ctx .GetSessionVars ().StmtCtx .RuntimeStatsColl .RegisterStats (fkc .ID (), fkc .stats )
0 commit comments