zoukankan      html  css  js  c++  java
  • 事务和锁学习

      为什么要使用事务?

      一个经典的例子就是银行转账问题。当把钱从一个银行转到另一个银行的时候,这操作由两步完成,首先要把钱从一个银行提取出来,然后再将钱存入另一个银行。如果此时,钱已经从一个银行提取出了,但将钱存入另一个银行的过程中或之前发生异常情况,如果没有事务保护就会出现源账号中钱减少,但目标账号中的钱并没有增加的情况。

      事务简介:从严格意义上讲,事务是形成一个逻辑工作单位的数据库操作的汇集。通俗的讲,事务是能以原子操作形式完成的一系列操作。

      事务四个基本特性:

        原子性:一个事务中所有数据库操作是一个不可分割的整体,这些操作要么全部执行,要么全部无效。

        一致性:在事务处理执行之前和之后,数据是一致的。

        隔离性:一个事务对另一个事务没有影响。

        持久性:一个事务一旦完成全部操作后,它对数据库操作将永久反映在数据库中。

      为什么要引入锁?

      多个用户同时对数据库操作会带来数据不一致的问题。

      并发的副作用:

        丢失更新:两个用户或多个用户同时修改数据库,其中一个用户修改破坏了另一个用户的修改结果。

        脏读:一个用户进程读取了另一个用户进程修改过但没有正式提交的数据,这时导致了数据不一样的情形发生了。

        不可重复读:一个用户读取数据,另一用户读取该数据并修改,此时前一个用户在读取发现前后两次数据不一致。

        幻影:一个用户读取到一些数据,另一个用户插入一些数据,前一用户再查看的时候新数据就会出现。

      事务的隔离级别

        隔离级别      脏读        不可重复读        幻影

        read uncommitted  可能          可能             可能

        read committed   不可能        可能             可能

        Repeatable read    不可能           不可能              可能

          Serializable       不可能          不可能                不可能

       锁的分类

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

          悲观锁:依靠数据库来管理锁的工作。

          乐观锁:不依赖数据库的事务机制,是应用层面的。

        2.从数据库角度来看分为排它锁、共享锁和更新锁。

          排它锁:排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。

          共享锁:共享(S)锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据便立即释放资源上的

              共享(S 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享(S)锁。

          更新锁:用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

      锁的粒度

        锁的粒度是指被封锁目标的大小,封锁粒度小则并发性高;封锁粒度大则并发性低。

        SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁。


  • 相关阅读:
    5分钟了解为什么学习Go
    jieba gensim 相似度实现
    functiils.lru_cache缩短递归时间
    python深浅copy和赋值
    ajax上传文件 基于jquery form表单上传文件
    form组件类 钩子函数验证
    基于jquery读取input上传的文件内容
    MongonDB指令汇总
    冥想编程
    《如何阅读一本书》读书笔记
  • 原文地址:https://www.cnblogs.com/xqhppt/p/1930582.html
Copyright © 2011-2022 走看看