数据库中锁通常分为行锁和表锁。(有的还有页锁)
行锁:
- 共享锁
又称读锁,简单讲就是多个事务对同一数据进行共享一把锁,都能访问到数据,但是只能读不能修改。
适用于:用来确认某行记录是否存在,并确保没有人对这个记录进行UPDATE或者DELETE操作,如果当前事务也需要对该记录进行更新操作,则很有可能造成死锁。
使用方法:
SELECT * from contry where id = "1" lock in share
由于对于contry 表中,id字段为主键,就也相当于索引。执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是行锁。
- 排他锁
又称写锁,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,只有获取排他锁的事务可以对数据进行读取和修改。
适用于:锁定行记录后需要进行更新操作的应用。
对于多个不同的事务,对同一个资源只能有一把锁。
与共享锁类型,在需要执行的语句后面加上for update就可以了
SELECT * from contry where id = "1" for update
- 悲观锁
悲观锁包含了共享锁和排它锁。
- 乐观锁
不加锁,解决并发 使用版本号+1或者时间戳来记录update/insert的最新数据。
注意:悲观锁和乐观锁的概述在本人另一篇文中https://www.jianshu.com/p/fbc52087cf70
里面有介绍。
表锁:
表级锁使用与并发性不高,以查询为主,少量更新的应用,比如小型的web应用。
而行级锁适用于高并发环境下,对事务完整性要求较高的系统,如在线事务处理系统。
网友评论