sql server 事物与锁

http://www.cnblogs.com/knowledgesea/p/3714417.html

一、表account

CREATE TABLE [dbo].[account](
[UserID] [int] NULL,
[MoneyAccount] [decimal](10, 2) NULL
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[account] ADD  DEFAULT ((0)) FOR [MoneyAccount]
GO

二、

  ---------------------方法1--------------------
  create proc Zz
  @userpost int,
  @userget int,
  @moneyaccoment decimal(10,2)
  as 
  begin tran
  update account set MoneyAccount=MoneyAccount-@moneyaccoment where UserID=@userpost
  update account set MoneyAccount=MoneyAccount+@moneyaccoment where UserID=@userget
  if(@@ERROR>0)
  begin
  rollback tran
  return 0
  end
  else
  begin
  commit tran
      return 1
  end


  ---------------------方法2--------------------
  create proc Zz2
  @userpost int,
  @userget int,
  @moneyaccoment decimal(10,2)
  as 
  begin tran
  begin try
  update account set MoneyAccount=MoneyAccount-@moneyaccoment where UserID=@userpost
  update account set MoneyAccount=MoneyAccount+@moneyaccoment where UserID=@userget
  end try
  begin catch
      select Error_number() as ErrorNumber,  --错误代码
             Error_severity() as ErrorSeverity,  --错误严重级别,级别小于10 try catch 捕获不到
             Error_state() as ErrorState ,  --错误状态码
             Error_Procedure() as ErrorProcedure , --出现错误的存储过程或触发器的名称。
             Error_line() as ErrorLine,  --发生错误的行号
             Error_message() as ErrorMessage  --错误的具体信息
if (@@trancount>0)
rollback tran
  end catch
  if(@@trancount>0)------大于零说明事务已经开启
   commit tran
   go

exec Zz 1,3,33333.66

三、锁

1.分独占锁,共享锁和更新锁

锁模式 描述

共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

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

排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章