加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获得写锁(排他锁)。当两个事务互相之间需要等待对方释放获得的资源时,如果系统不进行干预则会一直等待下去,也就是进入了死锁(deadlock)状态。
#创建数据库
create database chuanzhi;
#选择数据库
use chuanzhi;
#创建测试表
CREATE TABLE `tb_heima` (
`id` INT NOT NULL,
`username` VARCHAR(45) NULL,
PRIMARY KEY (`id`)
);
#插入测试数据
INSERT INTO `tb_heima` (`id`, `username`) VALUES ('1', '传智教育-教育行业A股IPO第一股');
注意:此时更新是成功的,但并未提交事务。
登录mysql,开启另一个事务操作同上。
再次执行更新语句,mysql> update tb_heima set username = ‘heima’ where id =1;
注意:此时第二个窗口处于等待中,需要等待第一个窗口释放写锁才能执行成功。
注意:由于第一个窗口未提交事务,导致第二个窗口在等待一段时候后,超过锁定等待超时。
通过mysql客户端工具连接,按照以下步骤执行。
注意:超过锁定等待超时后,此条记录会消失,也就是说正在阻塞的记录在此表才能查看到。
注意:查询出死锁后,得到trx_mysql_thread_id死锁的id。
kill 15;
kill 16;
注意:确认此表是否存在锁事务记录,如果没有则说明死锁问题已经解决。