事务和锁学习

  为什么要使用事务?

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

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

  事务四个基本特性:

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

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

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

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

  为什么要引入锁?

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

  并发的副作用:

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

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

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

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

  事务的隔离级别

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

    read uncommitted  可能          可能             可能

    read committed   不可能        可能             可能

    Repeatable read    不可能           不可能              可能

      Serializable       不可能          不可能                不可能

   锁的分类

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

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

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

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

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

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

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

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

  锁的粒度

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

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


原文地址:https://www.cnblogs.com/xqhppt/p/1930582.html