SQL SERVER之事务控制

–事务:一系列SQL操作的逻辑工作单元
–四个属性(ACID):原子性、一致性、隔离性、持久性

原子性:对于事务必须是一个完整的工作单元,事务中对数据的操作要么全部执行,要么全部不执行
一致性:事务完成时,所有的数据都必须保持一致状态。在相关的数据库中,所有的规则都必须由事务进行修改
– **隔离性:**如果多个事务对同一数据进行操作,那么当前事务的操作必须与其它事务进行隔离。
–事务在识别操作数据时,要么是第一个事务处理之前的状态.要么是第二个事务处理之后的状态。
– 事务不会查看中间状态数据

持久性:当事务提交成功后,事务对数据库的数据操作会被永久保存下来

–用途:保证数据的完整性
–如果事务执行成功,那么事务中相关的数据操作就能被完成
–如果事务执行失败,那么事务中相关的数据操作进行回滚,所有的数据修改将被还原

–经常使用一个变量来判断在事务执行过程中是否失败:
–比如:@iErrorCount,为0的话,执行成功,否则值为错误码,说明执行失败

DECLARE @iErrorCount INT;
SET @iErrorCount=0;
BEGIN TRAN Tran1
INSERT INTO Course VALUES('C# CRM项目开发')
INSERT INTO Course VALUES('Java从入门到精通')
SET @iErrorCount=@iErrorCount+@@ERROR
IF @iErrorCount=0
BEGIN
COMMIT TRAN Tran1; --执行事务
END
ELSE
BEGIN
 ROLLBACK TRAN Tran1; --回滚事务
END

显式事务:批范围的事务(整个操作属于批处理)
–如果批范围的事务在批处理完成时还没有提交或者回滚事务
–则系统将自动回滚该事务

–转账操作:银行转账
–张三转给Lara1000元

USE BankDB;
GO

DECLARE @TranferredMoney DECIMAL;
SET @TranferredMoney=2000;
UPDATE Account SET UserMoney=UserMoney-@TranferredMoney WHERE Name='张三'
UPDATE Account SET UserMoney=UserMoney+@TranferredMoney WHERE Name='Lara'

使用事务控制操作:
—属于一个批处理范围:如果所有sql都没有出现错误同时提交到数据库,持久化操作
—否则回滚事务,撤销对数据库内数据的操作,使其恢复到之前的状态

DECLARE @TranferredBalance DECIMAL,@iError INT;
SELECT @TranferredBalance=2000,@iError=0;//为变量赋值
BEGIN TRAN Money_Tranferred//开启事务控制
UPDATE Account SET UserMoney=UserMoney-@TranferredBalance WHERE Name='张三'
SET @iError=@iError+@@ERROR;
UPDATE Account SET UserMoney=UserMoney+@TranferredBalance WHERE Name='Lara'
SET @iError=@iError+@@ERROR;
IF @iError=0
BEGIN
 COMMIT TRAN Money_Tranferred;//提交事务
END
ELSE
BEGIN
 ROLLBACK TRAN Money_Tranferred;//回滚事务
END

–删除指定账号的信息

DECLARE @AError INT,@cardId INT;
SELECT @AError=0,@cardId=10008;

BEGIN TRAN delete_account --开启事务(显式事务)
DELETE FROM Account WHERE CardID=@cardId
SET @AError=@AError+@@ERROR
IF @AError=0
BEGIN 
COMMIT TRAN delete_account; --提交事务
END
ELSE
BEGIN
ROLLBACK TRAN delete_account; --回滚事务
END

设置事务的隔离级别:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; --不可脏读
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;--不可脏读、不可重复读
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;--不可脏读、不可重复读、不可幻读
发布了98 篇原创文章 · 获赞 1 · 访问量 854

猜你喜欢

转载自blog.csdn.net/qq_34550459/article/details/105590667