数据库锁机制1
数据库中锁机制:
共享锁:在非Serializable隔离级别下做查询不加任何锁,而在Serializable隔离级别下做的查询都会加共享锁,
共享锁特点:共享锁和共享锁可以共存,但是共享锁和排他锁不能共存。
排他锁:在所有隔离级别下,进行增删改都会加排他锁,
排他锁特点:和任意其他锁都不能共存。
如果是两个线程并发修改,一定会互相捣乱,这时必须利用锁机制防止多个线程并发修改。
如果两个线程并发查询,没有线程安全问题。(即便是在Serializable隔离级别下,做查询。多个共享锁也可以共存)。
如果两个线程一个修改,一个查询。可能存在(脏读,不可重复读,幻读也叫虚读)
注意的是:
不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同 ----行级别问题。
虚读(幻读):是指在一个事务内读取到了别人插入的数据,导致前后读取不一致 ----表级别的问题。
在实际的查询中,我们做的更多的是查询某个条件下的数据,也就是面临更多的是行级别的问题。
直接查询整个表的数据的情况相对少一点,即面临的表级别的问题要少一点。
更新丢失问题:多个线程基于同一个查询结果进行修改,后修改的人会将先修改人的修改覆盖掉
悲观锁:悲观的认为每一次查询都会造成数据更新丢失问题,在每次查询就加上排他锁。
select * from table where xxxx for update;
乐观锁:乐观的认为每次查询都不会造成更新丢失。利用一个版本字段进行控制。
如果查询很多,修改很少,使用乐观锁
如果查询很少,修改很多,使用悲观锁

浙公网安备 33010602011771号