• 事务和锁学习


      为什么要使用事务?

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

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

      事务四个基本特性:

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

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

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

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

      为什么要引入锁?

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

      并发的副作用:

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

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

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

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

      事务的隔离级别

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

        read uncommitted  可能          可能             可能

        read committed   不可能        可能             可能

        Repeatable read    不可能           不可能              可能

          Serializable       不可能          不可能                不可能

       锁的分类

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

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

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

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

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

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

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

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

      锁的粒度

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

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


  • 相关阅读:
    洛谷 P2969 [USACO09DEC]音符Music Notes
    洛谷 P2646 数数zzy
    洛谷 P1605 迷宫
    洛谷 P1157 组合的输出
    洛谷 P1449 后缀表达式
    洛谷 P1205 [USACO1.2]方块转换 Transformations
    洛谷 P1599 结算日
    洛谷 P2909 [USACO08OPEN]牛的车Cow Cars
    洛谷 P2118 比例简化
    3.2、spark集群运行应用之第三方jar的处理方式
  • 原文地址:https://www.cnblogs.com/xqhppt/p/1930582.html
Copyright © 2020-2023  润新知