SQL Server中的Transaction、error check、Lock、Isolation level、save point

Transaction及错误检查

SQL Server 中最重要的知识点莫过于事务,比如很多OLTP(联机事务处理)应用程序。什么是事务?事务就是一系列SQL语句的集合。事务包括隐性事务(例如Insert,Update等语句)和显性事务(用Begin Tran语句显式指明的事务)。事务中通常需要进行错误检查,用@@error来进行检查,比如:

Begin Tran
Update A set id =5 where id=1
If @@error<>0
rollback Tran
Update A set id =5 where id=2
If @@error<>0
rollback Tran
Commit Tran

Lock (锁)

按锁的粒度分,锁可以分成如下几类:

Key Lock(键锁)—>Row Lock(行级锁)—>Page Lock(页级锁)—>Extent Lock(扩展盘曲锁)—>Table Lock(表锁)—>Database Lock(数据库锁)

按锁的模式分,锁可以分为如下几类:

holdlock(共享锁),xlock(排它锁),Updlock(更新锁),Schlock(架构锁),Intent lock(意向锁)等等。如果要查看锁的类型,使用系统存储过程sys_lock来查看。

Isolation level (隔离级别)

事务有4中隔离级别,分别为:
read uncommitted(未提交读) — 读未提交,可以读取到内存中已经修改但是没有保存到硬盘上的信息,即允许数据脏读。
read committed(提交读) — 读提交,只能读取到已经提交到硬盘的信息,如果信息在内存中修改了,但是还没有提交到硬盘,即没有commit tran,则另一个事务什么也读取不到,被另一事物阻塞在此。当修改数据的事务一旦commit tran,则读取数据的事务立即运行,修改后的数据被读取到。
repeatable read(重复读) — 当事务A设置隔离级别为repeatable read在对数据进行读取,此时,事务B来修改数据,由于repeatable read隔离级别对操作的实体(行或者表)设置了更新锁,所以此时事务B不能对数据进行更新,但是事务B可以insert新数据,因为repeatable read隔离级别对操作的实体(行或者表)没有设置排它锁,所以事务A可以读取到幻象。
serializable(串行读) — 串行化,即事务一个接一个地进行操作,包括对操作实体的update,insert,select等等。

实际上隔离级别和锁的关系是密不可分的,隔离级别的实现本质上是对锁来进行操作,由于我们在操作一个实体对象的时候不能准确地判断到底应该上什么具体的锁 ,所以鉴于此,SQL server数据库为我们开辟了一个简单的途径,即使用隔离级别。实体的隔离级别越高,说明实体上锁的数量越多,种类越复杂;实体的隔离级别越高,并行化的几率越低,串行化的几率越高。

Save Point(保存点)

保存点的出现,是为了在事务恢复时更加地迅速和容易,因为不用把所有的操作都恢复,而是只用恢复到保存点即可,关于如何恢复以及更具体的知识,会在事务的恢复博客中详述。举个简单的例子:

Begin Tran
Update A set id =4 where id=1
Save tran t1
Update A set id =3 where id=2
If @@error<>0
rollback t1
Update A set id=5 where id =3
Commit Tran

Leave a Reply

Your email address will not be published. Required fields are marked *