MySql锁机制

1.行级共享锁加锁以后其他的也可加锁,行级排它锁加锁以后其他的不能再加锁

2.两种锁锁定以后其他人都只能查询,不能修改和删除。

3.表级锁锁定以后,当前窗口只能查询当前表;其他窗口可查询,但不能修改删除,也不能再加锁

 

行级共享锁

简称S锁,锁定数据之后,可以查询,但是不能修改删除。加共享锁可以使用select ... lock in share mode语句

查询锁等待超时时间
select @@Innodb_lock_wait_timeout;
A事务
#给depno=40的数据加共享锁
select * from dept where deptno=40 lock in share mode ;
B事务select * from dept where deptno=40;#成功
delete  from dept where deptno=40;#失败
select * from dept where deptno=40 lock in share mode;#成功

行级排它锁

简称X锁,锁定之后,其他事务可以读,不能修改删除,并且不能加共享锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句

查询锁等待超时时间
select @@Innodb_lock_wait_timeout;
A事务
#给deptno=40的数据加排他锁
select * from dept where deptno=40 for update ;
B事务
select * from dept where deptno=40;#成功
delete  from dept where deptno=40;#失败
select * from dept where deptno=40 lock in share mode;#失败

表级锁

对于InnoDB表,在绝大部分情况下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个别特殊事务中,也可以考虑使用表级锁。

  1. 第一种情况是:事务需要更新大部分或全部数据,表又比较大,如果使用默认的行锁,不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度。
  2. 第二种情况是:事务涉及多个表,比较复杂,很可能引起死锁,造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销
A事务
lock tables dept read ;
select * from dept;#成功
select * from emp;#失败
select * from dept where dpton=10 for update#失败,不能加锁
unlock tables ;
B事务:
select * from dept where deptno=40;#成功
delete  from dept where deptno=40;#失败
select * from dept where dpton=10 for update#失败,不能加锁

 

posted @ 2022-03-16 23:45  SimoonJia  阅读(58)  评论(0编辑  收藏  举报