zoukankan      html  css  js  c++  java
  • 事务4.3-事务与锁(锁)

    数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并 发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。

    锁模式
    1.共享锁(S锁):允许并发事务在封闭式并发控制下读取(select)资源。资源上存在共享锁时,任何其他事务都不能修改数据。读取操作一完成,就立即释放资源的共享锁,除非事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁。
    2.更新锁(U锁):更新锁是共享锁和排它锁的结合。更新锁意味着在做一个更新时,一个共享锁在扫描完成符合条件的数据后可能会转化成排它锁。
    这里面有两个步骤:(1)扫描获取where条件时,这部分是一个更新查询,此时是一个更新锁。
    (2)如果将执行写入更新,此时该锁升级到排他锁,否则,该锁转变成共享锁。
    更新锁可以防止常见的死锁
    3.排它锁(X锁):可以防止并发实物对资源进行访问。排它锁不与其他任何锁兼容。使用排它锁时,任何其他事物都无法修改数据,也不可读取,仅在使用NOLOCK提示或未提交读隔离级别时才会进行读取操作。

    共享锁和排它锁的区别:当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。


    悲观锁:悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生都会使用锁机制。
    悲观锁会完成以下功能:锁住读取的记录,防止其他事务读取和更新这些记录。其他事务会一直阻塞,知道这个事务结束。
    悲观锁实在使用了数据库的事务隔离功能的基础上,独享占用的资源,一次保证读取数据一致性,避免修改丢失。
    悲观锁可以使用Repeatable Read事务,他完全买组悲观锁的要求。

    乐观锁:乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西。
    如果使用乐观锁,那么数据库就必须加版本字段,否则就只能比较所有字段,但因为浮点类型不能比较,所以实际上没有版本字段是不可行的。

  • 相关阅读:
    swift textfiled 输入完毕 return 隐藏键盘 方法
    第一篇,仅是为了纪念
    ASP.NET MVC之验证终结者篇
    ASP.NET MVC扩展之HtmlHelper辅助方法
    Java历程-初学篇 Day04选择结构(1)
    Java历程-初学篇 Day03扫描仪与类型转换
    Java历程-初学篇 Day02变量,数据类型和运算符
    Java历程-初学篇 Day01初识java
    简单工厂模式和策略模式理解
    工厂模式和策略模式的区别
  • 原文地址:https://www.cnblogs.com/tian666/p/7852751.html
Copyright © 2011-2022 走看看