MySQL 死锁

297 阅读1分钟

我们都知道 死锁简单来说,就是a去等待b锁,并且它持有a锁,b在等待a锁,但是它持有b锁,相互等待就导致了死锁,这个锁是解不开的!!!

简单来说,下面第一个例子并不是死锁

首先数据是这样的

mysql> select * from test;
+----+------+---------+
| id | ip   | addtime |
+----+------+---------+
|  5 |    6 |    1234 |
|  6 |    6 |   12345 |
+----+------+---------+
2 rows in set (0.00 sec)

其次我们开启一个事务A

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update test set ip=6 where id=6;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql>

然后我们再开启一个事务B

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

# 发现在等待锁!(这里不是死锁,是等待锁,如果这个锁不释放其实本质上等于死锁,因为它占用了但是不释放!!)
mysql> update test set ip=5 where id=6;
# 最终会因为超时抛出异常!
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

那么我们看看它是什么锁!

此时其实我们应该即使开启一个客户端去查看状态 具体类型可以参考(可以看官方的文档): mysql.taobao.org/monthly/201…

mysql> select * from information_schema.innodb_locks\G
*************************** 1. row ***************************
    lock_id: 17179:784:3:3
lock_trx_id: 17179
  lock_mode: X #类型是排他锁, exclusive
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: PRIMARY # 主键类型
 lock_space: 784
  lock_page: 3
   lock_rec: 3
  lock_data: 6
*************************** 2. row ***************************
    lock_id: 17178:784:3:3
lock_trx_id: 17178
  lock_mode: X  #类型是排他锁
  lock_type: RECORD
 lock_table: `test`.`test`
 lock_index: PRIMARY
 lock_space: 784
  lock_page: 3
   lock_rec: 3
  lock_data: 6
2 rows in set, 1 warning (0.00 sec)