Locking Mechanisms in MySQL

From the MySQL Advanced Features cheat sheet · Transactions & Locking · verified Jul 2026

Locking Mechanisms

Row-level and table-level locking strategies

sql
-- Row-level locking (InnoDB)
START TRANSACTION;
SELECT * FROM orders 
WHERE id = 123 
FOR UPDATE;  -- Exclusive lock
-- Do work
COMMIT;

-- Shared lock
SELECT * FROM products
WHERE category = 'electronics'
FOR SHARE;  -- Multiple reads OK

-- Table locks
LOCK TABLES users WRITE, orders READ;
-- Do work
UNLOCK TABLES;

-- DETAILED_TAB:
-- Skip locked rows (MySQL 8.0+)
SELECT * FROM orders
WHERE status = 'pending'
FOR UPDATE SKIP LOCKED
LIMIT 10;

-- Nowait option (MySQL 8.0+)
SELECT * FROM inventory
WHERE product_id = 456
FOR UPDATE NOWAIT;  -- Fail immediately if locked

-- Check locks
SHOW ENGINE INNODB STATUS;

-- Find blocking queries
SELECT * FROM performance_schema.data_lock_waits;

-- Kill blocking connection
SHOW PROCESSLIST;
KILL CONNECTION 1234;

-- Deadlock retry pattern
DELIMITER $$
CREATE PROCEDURE transfer_with_retry()
BEGIN
  DECLARE retry_count INT DEFAULT 3;
  DECLARE CONTINUE HANDLER FOR 1213  -- Deadlock error
    BEGIN
      SET retry_count = retry_count - 1;
      IF retry_count > 0 THEN
        ROLLBACK;
        START TRANSACTION;
      END IF;
    END;
  -- Transaction logic here
END$$
💡 InnoDB uses row-level locking by default
📌 FOR UPDATE prevents other transactions from reading
⚡ SKIP LOCKED great for job queues
⚠️ Table locks block all other operations
🔗 Related: innodb_deadlock_detect setting
lockingconcurrency

More MySQL tasks

Back to the full MySQL Advanced Features cheat sheet