MySQL数据库锁
表锁、页锁、行锁。
页锁同样很少用来了;
InnoDB 的行锁有共享锁(s)和排它锁(x);
共享锁(s)是多个事务可以同时获取一个锁。如:CountDownLatch。InnoDB会自动加锁。
手动如何加锁呢?如下
select * from table where id='1' lock in share mode;
排它锁(x)是一个锁在某一时刻只能被一个事务享有,其它事务必须等待锁被释放之后才可能获取到锁。如:ReentrantLock
共享锁(s)和排它锁(x)都属于悲观锁。
悲观锁和乐观锁
悲观锁
select * from table where id='1' for update;
通过 sql 设置了悲观锁,此时别的事务只能等待,不能加共享锁也不能加排它锁。
乐观锁
在获取数据的时候,不会提前加锁,执行一堆业务逻辑之后,再去更新,此时会比较版本号,如果一样,执行并将版本号+1,否则会重新查询再去更新。
死锁
死锁示例:
···事务A、事务B分别设置了一把锁,
事务A: select * from table where id='1' for update;
事务B: select * from table where id='2' for update;
···事务A、事务B再去请求的时候,只能互相等待,就会导致死锁。
事务A: select * from table where id='2' for update;
事务B: select * from table where id='1' for update;