事务概念
事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。
事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等。
事务的ACID特性
原子性(Atomicity):事务的原子性是指一个事务中包含的一条语句或者多条语句构成了一个完整的逻辑单元,这个逻辑单元具有不可再分的原子性。这个逻辑单元要么一起提交执行全部成功,要么一起提交执行全部失败。
一致性(Consistency):可以理解为数据的完整性,事务的提交要确保在数据库上的操作没有破坏数据的完整性,比如说不要违背一些约束的数据插入或者修改行为。一旦破坏了数据的完整性,SQL Server 会回滚这个事务来确保数据库中的数据是一致的。
隔离性(Isolation):与数据库中的事务隔离级别以及锁相关,多个用户可以对同一数据并发访问而又不破坏数据的正确性和完整性。但是,并行事务的修改必须与其它并行事务的修改相互独立,隔离。 但是在不同的隔离级别下,事务的读取操作可能得到的结果是不同的。
持久性(Durability):数据持久化,事务一旦对数据的操作完成并提交后,数据修改就已经完成,即使服务重启这些数据也不会改变。相反,如果在事务的执行过程中,系统服务崩溃或者重启,那么事务所有的操作就会被回滚,即回到事务操作之前的状态。
如何定义事务
(1)显示定义:以BEGIN TRAN开始,提交的话则COMMIT提交事务,否则以ROLLBACK回滚事务。
--定义事务
BEGIN TRAN;
INSERT INTO dbo.T1(keycol, col1, col2) VALUES(4,101,'C');
INSERT INTO dbo.T1(keycol, col1, col2) VALUES(4,201,'X');
COMMIT TRAN;
(2)隐式定义:SQL Server中默认把每个单独的语句作为一个事务。
换句话说,SQL Server默认在执行完每个语句之后就自动提交事务。当然,我们可以通过IMPLICIT_TRANSACTIONS会话选项来改变SQL Server处理默认事务的方式,该选项默认情况下是OFF。如果将其设置为ON,那么就不必用BEGIN TRAN语句来表明事务开始,但仍然需要以COMMIT或ROLLBACK来标明事务完成。
事务案例
1.先创建一个Users表
2.语句
--小勇转账200给小敏
go
--定义一个变量,记录错误数
declare @error_nums int
set @error_nums=0
--开始事务
begin transaction tran_change
begin try
update Users set Remain=Remain-200 where id=1
set @error_nums=@error_nums+@@ERROR
update Users 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())+',错误消息'+error_message()
end catch
if(@error_nums>0) --表示前面有错
rollback transaction tran_change --回滚事务
else
commit transaction tran_change --执行事务
3.查询一下看执行结果
select * from Users