我们都知道 死锁简单来说,就是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)