我对SQL事物的理解
-
SQL中事物的定义及作用?
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,()如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。是指访问并可能更新数据库中各种数据项的一个程序逻辑执行单元(unit)。也是用户在SQL数据库中定义的一个数据库操作序列,这些用户所定义的操作要么不做,要么全做,是一个不可分割的工作单位。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 -
事物的特点?
一个逻辑工作单元必定会有ACID属性即:
原子性(ATOMICITY):即一个事物要被完整的无二性的完成。一旦执行的操作环节中出现错误,所有构成事物的操作所产生的结果必须被撤销,数据会回滚(Rollback)到执行操作前的状态。一致性(CONSISTENCY):一个事物应该保护所有定义在数据上的不变的属性(如:完整性约束)。在完成了一个成功的事务时,数据应处于一致的状态。换句话说,一个事务应该把系统从一个一致-状态转换到另一个一致状态。举个例子,在关系数据库的情况下, 一个一致的事务将保护定义在数据上的所有完整性约束。
隔离性(ISOLATION): 在同一个环境中可能有多个事务并发执行,而每个事务都应表现为独立执行,互不影响。
持久性(DURABILITY):
一个被事物被执行后所产生的结果是永久的。 -
事物的控制语句
BEGIN 开始一个事务。
ROLLBACK 事务回滚。
ROLLBACK TO identifier 把事务回滚到标记点。
COMMIT 提交事务。
RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常。 -
事物的创建及调用
注:Remain是账户个人余额
--创建存储过程
create proc cp_Charge
(
@idOut int, --定义转出ID变量
@remain decimal(18,2), --定义账户个人余额变量
@idIn int --定义转变量入ID
)
as
--开始事务
begin Transaction tran_Charge
--定义变量接收错误
declare @err_nums int
set @err_nums =0
begin try
update Customers set Remain=Remain+200 where id=@idIn
set @err_nums=@err_nums+@@error
update Customers set Remain=Remain-200 where id=@idOut
set @err_nums=@err_nums+@@error
end try
begin catch
print '错误编号:'+convert(varchar,error_number())+'错误消息'+error_message()
set @err_nums=@err_nums+1
end catch
if(@err_nums>0) --说明语句有错误
rollback transaction tran_Charge--回滚事务
else
commit transaction tran_Charge --提交事务
select * from Customers