学习笔记-Sql Server事务

事务的定义

事务是作为单个逻辑单元执行的一系列操作,它是一个不可分割的工作逻辑单元。它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。

举个例子,我们经常用到的 ATM 存取款机,比如转账的时候,是先减去转出账户的金额,然后再在指定转入账户的金额加上转出的金额。如果刚好这个时候转出的操作已经执行完成,但是由于系统的故障,导致转入的操作失败了。那么怎么办?这就需要用到事务了,只要事务里面有一条命令未成功执行,那么数据就会回滚到事务开始之前的状态。

事务的特性

  1. 原子性(Atomicity)
    事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
    事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

  2. 一致性(Consistency)
    事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
    一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
    也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant).
    以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,
    比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性.

  3. 隔离性(Isolation)
    一个事务的执行不能被其他事务干扰。隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,
    执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,
    必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。

  4. 持续性/永久性(Durability)
    一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,不会被回滚。

实例展示

引用表

Customers表

列名 数据类型
ID int
Name nvarchar(50)
Remain decimal(18, 2)

用事务进行转账处理

select * from Customers 
go
--定义一个变量,记录错误数
declare @error_nums int
set @error_nums=0
--开始事务
begin transaction tran_change
begin try
update Customers set Remain=Remain-200 where id=1
set @error_nums=@error_nums+@@ERROR
update Customers set Remain=Remain-200 where id=2
set @error_nums=@error_nums+@@ERROR
end try
begin catch
 set @error_nums=@error_nums+1
 print '错误异常:' +convert(varchar,error_number())+',错误信息'+convert(varchar,error_message())
 end catch
if(@error_nums>0)--表示前面有错误
rollback tran tran_change  --回滚事务
else
commit tran tran_change  --执行事务

猜你喜欢

转载自blog.csdn.net/weixin_44615591/article/details/106376969