全局锁的开启命令:flush tables with read lock;
UNLOCK TABLE;解锁
表锁:lock tables furong_user read;
行锁;锁定一行:行级锁只会在事务中有效
间隙锁
乐观锁:在mysql里面没有内置的锁实现,实现的方式通常就是通过版本号来实现的,就是说每当一条记录被修改是就修改版本号。然后在跟新的时候查看版本号有没有被修改。已经被修改的话就是。优点就是在并发少的时候,不需要多大的事务回滚,效率高,但是缺点就是说,并发高的时候大量回滚影响性能。
一般是在修改的时候就加上版本号加一,并且where指定版本号。
悲观锁:在读写的时候加锁。在最后加一个for update
使用场景:写多的场景,并发多的场景,业务的强一致性要求高的场景。
for update 悲观锁,是写锁的方式实现悲观锁。
lock in share mode :共享锁,读锁。是读锁的方式实现的。
共享锁(读锁)
可以读,允许多个线程共同持有一把锁。
与排它锁(写锁)
只有一个线程可以对其读写操作。
意向锁:当一个表里面添加一个行锁的时候,会自动添加一个表级意向锁。在事务b要添加表锁的时候就直接判断有没有意向锁的存在,而不是每一行每一行的去查看,提高效率。如果意向锁是行锁的话就会一行一行查看,还不如不加。
意向锁是怎么支持行锁和表锁共存的:不是说同时让表锁行锁同时存在。而是同时支持。当事务a开了行锁的时候,事务b如果想去开启表锁就会去看意向锁是否存在,然后就可以让行锁和表锁共存了。
简单记住就是表的共享锁(读锁)和意向共享锁(读锁)可以互相兼容。
就是先加一个读锁,然后再加一个行锁的读锁可以加上。
临间锁:每个数据行上的非唯一索引都会存在一个临间锁。
假如age是到1,12,36.临间锁就是负无穷到1.左闭右开。1到12.12到36.36到正无穷。
然后如果12开启事务用了排他锁,锁住了这一行,我要插入(12到36]的age就会报错
记录锁
在SQL中,"FOR UPDATE"是用于指定在查询语句中获取的数据可以被更新的锁定模式。它通常与SELECT语句一起使用,以确保在事务中对查询结果进行更新时,其他事务无法修改相同的数据。
当使用"FOR UPDATE"时,查询语句将获取被选中的行的排他锁(exclusive lock)。这意味着其他事务无法同时修改或删除这些行,直到当前事务释放锁或提交事务。
使用"FOR UPDATE"的典型场景是在事务中执行查询,然后根据查询结果进行更新操作。例如,你可能需要查询某个表中的一些行,并在事务中对这些行进行更新,以确保其他事务无法同时修改这些行。