zoukankan      html  css  js  c++  java
  • (sql补充)关于锁

    举个例子吧 当你要进一个房间的时候,你想推门,这个时候刚好有个人想出来,他也想推门出去,于是,两个人就卡在那了,结果,后面排队的人也都动弹不了了,假如这个房间是个数据库,那么,数据库这个时候就卡壳了。
    锁正是为避免这种情况出现的
    悲观锁就是 一个一个来,当有人想进这个房间的时候,其他人都别动
    但假如这个房间有很多门,这些门通往不同的地方,比如,有可以直接进洗手间的,有可以进厨房的,结果,你一个人想去卧室,却禁止其他人进洗手间,这样对效率就会产生影响。于是,乐观所就是,当你想进的时候,等到你来到门的门口,才把当前这个门锁住。之所以叫乐观,也就是说,乐观地假定你的行为不会影响到其他人,等到影响到的时候再加锁。而悲观的意思,就是一开始就假定你会影响到其他人了,所以全部锁了干净。
    ------------------------------来自百度知道比较通俗的解释

     为什么要引入锁 




    多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:


    丢失更新

    a,b两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统


    脏读

    a用户修改了数据,随后b用户又读出该数据,但a用户因为某些原因取消了对数据的修改,数据恢复原值,此时b得到的数据就与数据库内的数据产生了不一致


    不可重复读

    a用户读取数据,随后b用户读出该数据并修改,此时a用户再读取数据时发现前后两次的值不一致


    并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致


    锁的分类



    锁的类别有两种分法:

    1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

    共享锁
    共享 (s) 锁允许并发事务读取 (select) 一个资源。资源上存在共享 (s) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (s) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (s) 锁。
    更新锁
    更新 (u) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (s) 锁,然后修改行,此操作要求锁转换为排它 (x) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (x) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (x) 锁以进行更新。由于两个事务都要转换为排它 (x) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
    若要避免这种潜在的死锁问题,请使用更新 (u) 锁。一次只有一个事务可以获得资源的更新 (u) 锁。如果事务修改资源,则更新 (u) 锁转换为排它 (x) 锁。否则,锁转换为共享锁。
    独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,sql server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。
    共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行select时,sql server会对对象加共享锁。

    2. 从程序员的角度看:分为乐观锁和悲观锁。

    乐观锁:完全依靠数据库来管理锁的工作。
    悲观锁:程序员自己管理数据或对象上的锁处理。
  • 相关阅读:
    一起谈.NET技术,WPF 自定义快捷键命令(Command) 狼人:
    一起谈.NET技术,WPF 基础到企业应用系列5——WPF千年轮回2 狼人:
    一起谈.NET技术,asp.net页面中输出变量、Eval数据绑定等总结 狼人:
    单片机沉思录——再谈static
    Java平台对脚本语言支持之ScriptEngine创建方式
    [置顶] [Html] Jquery那些事
    codeforces 165E Compatible Numbers
    2013第六周上机任务【项目2 程序填空(1)】
    腾讯再否认微信收费 三大运营商态度分化
    电子钟程序
  • 原文地址:https://www.cnblogs.com/zhujianxipan/p/3146915.html
Copyright © 2011-2022 走看看