第四章 管理事务和管理数据库 事务与锁

事务的类型

      隐式事务: 例 insert table values(1,'abc')

                         update table set col1=5 where col1=1

                         delete from table1 where col1=5

      显示事务  例 :删除后勤部

      declare @transaction_name varchar(32)

      select @transaction_name='my_transaction_delete'

      begin transaction @transaction_name

      go

      use sample

      go

      delete from department where dept_id='1012'

      go

      delete from employee where dept_id='1012'

      go

      commit transaction my_transaction_delete

      go

 

事务回滚  是指当事务中的某一语句执行失败时,将对数据库的操作恢复到事务执行前或某个指定的位置

      例 删除后勤部再将后勤部的职工划归到经理室

      begin transaction my_transaction_delete

      use sample

      go

      delete from department where dept_id='1012'

      save transaction after_delete

      update employee set dept_id='1001' where dept_id='1012'

      if @@error!=0 or @@rowcount=0 then

      begin

      rollback tran after_delete

      print '更新员工信息表时产生错误'

      commit transaction my_transaction_delete

      go

 

锁的概念

锁是在多用户环境下对资源访问的一种限制机制.当对一个数据源加锁后,此数据源就有了一定的访问限制,我们就称对此数据源进行了锁定.

锁的类别

    独占锁exclusive lock :独占锁锁定的资源只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受.执行数据更新命令,即insert  update  delete命令时,sql server会自动使用独占锁.但当对象上有其他锁存在时,无法对其加独占锁,独占锁一直到事务结束才能被释放

     共享锁shared lock共享锁锁定的资源可以被其他用户读取,但其他用户不能修改它.在select命令执行时,sql server通常会对对戏那个进行共享锁锁定,通常加共享锁的数据页被读取完毕后,共享锁就会立即被释放

     更新锁update lock:更新锁是为了防止死锁而设立的.当sql server准备更新数据时,它首先对数据对象作更新锁定,这样数据将不能被修改,但可以读取.等到sql server确定要进行更新数据操作时,它会自动将更新锁换为独占锁.但当对象上有其他锁存在时,无法对其作更新锁定

 

 

杀死进程 kill spid    (spid是system process id,即系统进程编号的缩写)

用系统存储过程sp_lock查看锁

      格式 sp_lock spid

 

为防止死锁发生,应遵循的规则

       1)尽量避免并发的执行涉及到修改数据的语句

       2)要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行

       3)预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁.例如不同的过程在事务内部对对象的更新执行顺序应尽量保持一致

       4)每个事务的执行时间不可太长,对程序段长的事务可考虑将其分割成几个事务

 

posted @ 2010-08-10 16:43  转航  阅读(189)  评论(0编辑  收藏  举报