为什么要使用事务?
一个经典的例子就是银行转账问题。当把钱从一个银行转到另一个银行的时候,这操作由两步完成,首先要把钱从一个银行提取出来,然后再将钱存入另一个银行。如果此时,钱已经从一个银行提取出了,但将钱存入另一个银行的过程中或之前发生异常情况,如果没有事务保护就会出现源账号中钱减少,但目标账号中的钱并没有增加的情况。
事务简介:从严格意义上讲,事务是形成一个逻辑工作单位的数据库操作的汇集。通俗的讲,事务是能以原子操作形式完成的一系列操作。
事务四个基本特性:
原子性:一个事务中所有数据库操作是一个不可分割的整体,这些操作要么全部执行,要么全部无效。
一致性:在事务处理执行之前和之后,数据是一致的。
隔离性:一个事务对另一个事务没有影响。
持久性:一个事务一旦完成全部操作后,它对数据库操作将永久反映在数据库中。
为什么要引入锁?
多个用户同时对数据库操作会带来数据不一致的问题。
并发的副作用:
丢失更新:两个用户或多个用户同时修改数据库,其中一个用户修改破坏了另一个用户的修改结果。
脏读:一个用户进程读取了另一个用户进程修改过但没有正式提交的数据,这时导致了数据不一样的情形发生了。
不可重复读:一个用户读取数据,另一用户读取该数据并修改,此时前一个用户在读取发现前后两次数据不一致。
幻影:一个用户读取到一些数据,另一个用户插入一些数据,前一用户再查看的时候新数据就会出现。
事务的隔离级别
隔离级别 脏读 不可重复读 幻影
read uncommitted 可能 可能 可能
read committed 不可能 可能 可能
Repeatable read 不可能 不可能 可能
Serializable 不可能 不可能 不可能
锁的分类
1.从程序员的角度看分为悲观锁和乐观锁。
悲观锁:依靠数据库来管理锁的工作。
乐观锁:不依赖数据库的事务机制,是应用层面的。
2.从数据库角度来看分为排它锁、共享锁和更新锁。
排它锁:排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。
共享锁:共享(S)锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的
共享(S 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享(S)锁。
更新锁:用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
锁的粒度
锁的粒度是指被封锁目标的大小,封锁粒度小则并发性高;封锁粒度大则并发性低。
SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁。