mysql表加锁与解锁

一、加锁

表名:test

1、加读锁

#读锁,锁定之后,无论是当前线程还是其他线程均只能读操作,写操作全部被堵塞,备份时可以用,避免在备份过程中,表被更新
LOCK TABLES test READ;

 

2、加写锁

#写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.
LOCK TABLES test WRITE;

 

3、行级锁、排它锁

表需要是InnoDB引擎,还需要配合事务;

BEGIN;
SELECT * FROM test WHERE sn = 'F20LIKE22082316' FOR SELECT;
COMMIT;  #事务提交[或者 ROLLBACK 事务回滚]

在启动事务然后锁定某一行后,在事务提交之前或者事务回滚之前该行会一直处于锁定状态,此时只允许当前线程进行读写操作,其他线程只能进行读操作,其他写操作全部被堵塞。

MYSQL中只有INNODB和BDB类型的数据表才能支持事务处理!其他的类型不支持;

 

二、解锁

1、查看正在被锁的表

show OPEN TABLES where In_use > 0;

解锁表:

#解锁 (不用写表名,只能自己解锁,即同一连接,别人无效,不同连接无效。)
UNLOCK TABLES;

 

2、查锁表进程

#查锁表进程
show full processlist;
#或
SELECT * FROM information_schema.PROCESSLIST;
 
#杀掉锁表进程id=33(任何人都行)(连接断开,即进程结束,即锁也没了。)
kill 33;

 

3、事务锁

1:查看当前的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;

杀死进程id,就是上面命令的trx_mysql_thread_id列
kill 线程ID;

2:查看当前锁定的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

3:查看当前等锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

 

posted @ 2023-04-19 11:07  米兰的小铁將  阅读(622)  评论(0编辑  收藏  举报