实际上,为了提高数据库性能,我们尽可能让多个事务同时执行,这就是并发;
锁机制:
锁,可以理解为一种‘标注’,表明其数据正在被事务使用......
1,检查数据上有木有锁(其它事务加上去的),确定当前事务的行为;如:等待......;
2,加锁:提示其他事务,该数据正在被事务使用;
3,解锁:操作完成后,删除/消除锁;
锁的类型:
共享锁(Shared,用S表示):用于只读的SELECT语句,又称读锁,共享锁上可以加共享锁,因为它们兼容;
排它锁(Exclusive,用X表示):又称独占锁或写锁,用于INSERT/UPDATE/DELETE语句,X锁不兼容任何锁;
更新锁(Update,用U表示):用在UPDATE/DELETE之前的查找过程,仅在WHERE子句查找过程中使用,一旦找到数据,U锁立刻变为X锁,U锁和U锁不兼容,但和S锁兼容;
四个事务的控制级别是如何使用锁的:
READE UNCOMMITTED(读未提交):读取时,不加共享锁,其它事务也能读(会产生脏读);
READE COMMITTED(读已提交):读取时,加共享锁,其它事务不能读(避免脏读),完成读取就释放;
REPEATABLE READ(可重复读):共享锁一直到事务结束才释放(避免不可重复读),但仅限于查找数据上(可产生幻影读);
SERIALIZABLE(序列化):共享锁的范围扩展到所有可以影响到该事务的对象(避免了幻影读);
以上锁控制,变化的都是共享锁,排它锁始终是在事务结束后释放;
死锁的形成: