锁的类型和兼容性
当我们使用单击版的系统时,根本不需要考虑并发量,但现在我们很多的系统都会有大量用户,我们就不得不面对并发,当出现并发访问时,我们自然会想到加锁,而数据库会自动管理锁,当进行查询和修改数据库时,自动为其加上锁。接下来我们先来看一下有哪几种锁!
一、共享锁
共享:正如这个词的中文意思一样,大家可以可以共享资源。共享锁主要用于读写数据操作,它是非读占的,允许其他事务同时读取其锁定的资源,但不允许修改。
特点:
加锁条件:当一个事务执行查询Select语句时,数据库会自动为其加上一把共享锁,来锁定被查询的数据
解锁条件:默认情况下,当数据库被读取后,数据库立即解除共享锁。
与其他所的兼容性:数据上还可以防止共享锁和更新锁
并发性能:具有良好的并发性能,当多个事务读取相同的数据时,每个事务会得到一把共享锁,故可以
同时读锁定的数据。
二、独占锁
人如其名,非常霸道,只能自己来使用,不允许其他事务读取和修改。独占锁,也叫排他锁,适用于修改数据 的地方,我自己来修改,改完后其他事务才可以操作。
特点:
加锁条件:当一个事务执行insert、update、delete语句时,数据库会自动对SQL语句操作的数据资源
使用独占锁。如果数据资源上已有其他锁,将不能添加独占锁。
解锁条件:当事务结束,独占锁被解除。
与其他所兼容性:不能兼容其他锁
并发性能:并发性能差,只允许一个事务访问访问锁定的资源。其他事务需要访问相同资源时,必须等
待前一个事务结束,解除了独占锁,其他事务才有机会访问该数据。
三、更新锁
更新是初始化阶段用来锁定可能要被修改的资源,这样可以避免死锁现象。
例如:update语句
update T_user set user_name ="zss" where id =1;
使用更新锁,更新数据的操作分为两步:
(1)获得一个更新锁,读取T_user表中id为1的记录
(2)将更新锁升级为独占锁,更新数据库表中的数据
特点:
加锁条件:当一个事务执行update语句时,数据库为事务分配一个更新锁。
解锁条件:当数据读取完毕,执行更新操作时,将更新锁升级为独占锁。
与其他锁兼容性:更新锁和共享锁兼容,但一个资源最多放置一个更新锁
并发性能:允许多个事务同时读锁定的资源,但不允许其他事务修改它。
四、总结
我们操作数据库,从数据库角度来看,就是这三种锁,我们利用锁就是用来解决高并发访问下数据不一致的额问题。这是从数据库角度来看我们将锁分为三种,我们看看从开发人员的角度来看,锁又分为哪几种呢?期待我的更新吧!