--事务:在数据库中有时候需要把多个步骤的指令当作一个整体来运行,这个整体要么全部执行成功,要么全部失败,这就需要用到事务。
/*1.事务特点:事务有若干条T—SQL指令组成,并且所有的指令作为一个整体提交给数据库系统,执行时,这组指定要么全部执行完成,要么全部取消。因此,事务是一个不可分割的逻辑单元。
事务有四个属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)以及持久性(Durability),也称为事务的ACID属性
A、原子性:事务内的所有工作要么全部完成,要么全部不完成,不存在只有一部分完成的情况;
C、一致性:事务内的操作都不能违反数据库的约束或规则,事务完成时所有内部数据结构都必须是正确的;
I、隔离性:事务之间是相互隔离的,如果有两个事务对同一个数据库进行操作,比如读取表数据,
任何一个事务看到的所有的内容要么是其他事务完成之前的状态,要么是其他事务完成之后的状态。一个事务不可能遇到另一个事务的中间状态;
D、持久性:事务完成之后,它对数据库系统的影响是持久的,即使是系统错误,重启系统后该事务的结果依然存在。
*/
/*2.事务模式:A、显式事务:显式事务就是用户使用T-SQL明确的定义事务的开始(begin transaction)和提交
(commit transaction)或回滚事务(rollback transaction)
B、自动提交事务:自动提交事务是一种能够自动执行并能自动回滚事务,这种方式是T-SQL的默认事务方式,例如在删除一个表记录的时候,
如果这条记录有主外键关系的时候,删除就会受主外键约束的影响,那么这个删除就会取消;
可以设置事务进入隐式方式:set implicit_transaction on ;
C、隐式事务:隐式事务是指当事务提交或回滚后,SQL Server自动开始事务。因此,隐式事务不需要使用begin transaction 显式开始,
只需直接提交事务或回滚事务的T-SQL语句即可。使用时,需要设置set implicit_transaction on语句,
将隐式事务模式打开,下一个语句会启动一个新的事务,再下一个语句又将启动一个新事务。
*/
/*3.事务处理:A、begin transaction语句:开始事务,而@@trancount全局变量用来记录事务的数目值加1,
可以用@@error全局变量记录执行过程中的错误信息,如果没有错误可以直接提交事务,有错误可以回滚;
B、commit transaction语句:回滚事务,表示一个隐式或显式的事务的结束,对数据库所做的修改正式生效。并将@@trancount的值减1;
C、rollback transaction语句:回滚事务,执行rollback transaction语句后,数据会回滚到begin transaction时候的状态。
*/
--示例:
--开始事务
begin transaction tran_bank;
declare @tran_error int;
set @tran_error=0;
begin try
update bank set totalMoney=totalMoney -10000 where userName='jack';
set @tran_error=@tran_error+@@error;
update bank set totalMoney=totalMoney +10000 where userName='jason';
set @tran_error=@tran_error+@@error;
end try
begin catch
print '出现异常,错误编号:'+convert(varchar,error_number())+',错误信息:'+error_message();
set @tran_error=@tran_error+1;
end catch
if(@tran_error>0)
begin
--执行出错,回滚事务
rollback tran;
print '转账失败,取消交易';
end
else
begin
--没有异常,提交事务
commit tran;
print '转账成功';
end
go