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。确保不会同时同一资源进行多重更新。