锁的类型和兼容性

   当我们使用单击版的系统时,根本不需要考虑并发量,但现在我们很多的系统都会有大量用户,我们就不得不面对并发,当出现并发访问时,我们自然会想到加锁,而数据库会自动管理锁,当进行查询和修改数据库时,自动为其加上锁。接下来我们先来看一下有哪几种锁!


一、共享锁

   共享:正如这个词的中文意思一样,大家可以可以共享资源。共享锁主要用于读写数据操作,它是非读占的,允许其他事务同时读取其锁定的资源,但不允许修改。

   特点:

     加锁条件:当一个事务执行查询Select语句时,数据库会自动为其加上一把共享锁,来锁定被查询的数据

     解锁条件:默认情况下,当数据库被读取后,数据库立即解除共享锁。

     与其他所的兼容性:数据上还可以防止共享锁和更新锁

     并发性能:具有良好的并发性能,当多个事务读取相同的数据时,每个事务会得到一把共享锁,故可以

            同时读锁定的数据。


二、独占锁

   人如其名,非常霸道,只能自己来使用,不允许其他事务读取和修改。独占锁,也叫排他锁,适用于修改数据 的地方,我自己来修改,改完后其他事务才可以操作。

   特点:

      加锁条件:当一个事务执行insert、update、delete语句时,数据库会自动对SQL语句操作的数据资源

            使用独占锁。如果数据资源上已有其他锁,将不能添加独占锁。

      解锁条件:当事务结束,独占锁被解除。

      与其他所兼容性:不能兼容其他锁

      并发性能:并发性能差,只允许一个事务访问访问锁定的资源。其他事务需要访问相同资源时,必须等

            待前一个事务结束,解除了独占锁,其他事务才有机会访问该数据。


三、更新锁

   更新是初始化阶段用来锁定可能要被修改的资源,这样可以避免死锁现象。 

   例如:update语句

    update T_user set user_name ="zss" where id =1;

   使用更新锁,更新数据的操作分为两步:

   (1)获得一个更新锁,读取T_user表中id为1的记录

   (2)将更新锁升级为独占锁,更新数据库表中的数据

   特点:

      加锁条件:当一个事务执行update语句时,数据库为事务分配一个更新锁。

      解锁条件:当数据读取完毕,执行更新操作时,将更新锁升级为独占锁。

      与其他锁兼容性:更新锁和共享锁兼容,但一个资源最多放置一个更新锁

      并发性能:允许多个事务同时读锁定的资源,但不允许其他事务修改它。


四、总结

   我们操作数据库,从数据库角度来看,就是这三种锁,我们利用锁就是用来解决高并发访问下数据不一致的额问题。这是从数据库角度来看我们将锁分为三种,我们看看从开发人员的角度来看,锁又分为哪几种呢?期待我的更新吧!

           

原文地址:https://www.cnblogs.com/zsswpb/p/6329433.html