一、 MySQL 中的锁
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发
度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发
度也最高。
页面锁(gap 锁,间隙锁):开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度
界于表锁和行锁之间,并发度一般。
二、MyISAM引擎中的锁:
1、共享读锁
语法:lock table 表名 read
2.独占写锁
1.lock table testmysam WRITE
读锁,对 MyISAM 表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一 表的写请求
读锁,对 MyISAM 表的读操作,不会阻塞当前 session 对表读,当对表进行修改 会报错
读锁,一个 session 使用 LOCK TABLE 命令给表 f 加了读锁,这个 session 可以查询锁定表 中的记录,但更新或访问其他表都会提示错误;
写锁,对 MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作;
写锁,对 MyISAM 表的写操作,当前 session 可以对本表做 CRUD,但对其他表进行操作 会报错
三、InnoDB引擎中的锁
在 mysql 的 InnoDB 引擎支持行锁
共享锁又称:读锁。当一个事务对某几行上读锁时,允许其他事务对这几行进行读操作,但
不允许其进行写操作,也不允许其他事务给这几行上排它锁,但允许上读锁。
排它锁又称:写锁。当一个事务对某几个上写锁时,不允许其他事务写,但允许读。更不允
许其他事务给这几行上任何锁。包括写锁
1、上共享锁的写法:lock in share mode
例如: select * from 表 where 条件 lock in share mode;
2、上排它锁的写法:for update
例如:select * from 表 where 条件 for update;
3.示例
- BEGIN
select * from testdemo where id =1 for update
在另外一个 session 中
update testdemo set c1 = '1' where id = 2 成功
update testdemo set c1 = '1' where id = 1 等待
2.BEGIN
update testdemo set c1 = '1' where id = 1
在另外一个 session 中
update testdemo set c1 = '1' where id = 1 等待
四、查看数据库中的锁
查询数据库中的所列表
- select * from information_schema.INNODB_LOCKS;
查询数据库中等待锁的,查询语句
2.select * from sys.innodb_lock_waits
五、杀死kill锁定的session回话
SELECT
r.trx_id waiting_trx_id,
r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread
FROM
information_schema.innodb_lock_waits w
INNER JOIN
information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
INNER JOIN
information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
kill 29,杀死查询线程