@@ -223,10 +223,19 @@ 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 len (fkc .toBeLockedKeys ) > 0 && fkc .stats != nil {
233
+ fkc .stats .Lock = time .Since (start )
234
+ fkc .stats .Total = fkc .stats .Lock
235
+ }
236
+
237
+ return err
228
238
}
229
- start := time .Now ()
230
239
if fkc .stats != nil {
231
240
defer func () {
232
241
fkc .stats .Keys = len (fkc .toBeCheckedKeys ) + len (fkc .toBeCheckedPrefixKeys )
@@ -248,6 +257,15 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error {
248
257
if fkc .stats != nil {
249
258
fkc .stats .Check = time .Since (start )
250
259
}
260
+
261
+ err = fkc .doLock (ctx )
262
+ if fkc .stats != nil {
263
+ fkc .stats .Lock = time .Since (start ) - fkc .stats .Check
264
+ }
265
+ return err
266
+ }
267
+
268
+ func (fkc * FKCheckExec ) doLock (ctx context.Context ) error {
251
269
if len (fkc .toBeLockedKeys ) == 0 {
252
270
return nil
253
271
}
@@ -263,9 +281,6 @@ func (fkc *FKCheckExec) doCheck(ctx context.Context) error {
263
281
// doLockKeys may set TxnCtx.ForUpdate to 1, then if the lock meet write conflict, TiDB can't retry for update.
264
282
// So reset TxnCtx.ForUpdate to 0 then can be retry if meet write conflict.
265
283
atomic .StoreUint32 (& sessVars .TxnCtx .ForUpdate , forUpdate )
266
- if fkc .stats != nil {
267
- fkc .stats .Lock = time .Since (start ) - fkc .stats .Check
268
- }
269
284
return err
270
285
}
271
286
@@ -542,7 +557,7 @@ type fkCheckKey struct {
542
557
isPrefix bool
543
558
}
544
559
545
- func (fkc FKCheckExec ) checkRows (ctx context.Context , sc * stmtctx.StatementContext , txn kv.Transaction , rows []toBeCheckedRow ) error {
560
+ func (fkc * FKCheckExec ) checkRows (ctx context.Context , sc * stmtctx.StatementContext , txn kv.Transaction , rows []toBeCheckedRow ) error {
546
561
if fkc .ctx .GetSessionVars ().StmtCtx .RuntimeStatsColl != nil {
547
562
fkc .stats = & FKCheckRuntimeStats {}
548
563
defer fkc .ctx .GetSessionVars ().StmtCtx .RuntimeStatsColl .RegisterStats (fkc .ID (), fkc .stats )
0 commit comments