绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
sql server事务的使用是为了确保数据的一致性(未完待续)
2023-03-22 16:32:53

sql server事务的使用是为了确保数据的一致性。

BEGIN TRANSACTION

  • 标记一个显式本地事务的起始点。 显式事务以 BEGIN TRANSACTION 语句开始,并以 COMMIT 或 ROLLBACK 语句结束。
  • BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。
  • BEGIN TRANSACTION 代表一点,由连接引用的数据在该点逻辑和物理上都一致的。 如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。
  • 每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。

COMMIT TRANSACTION

标志一个成功的隐性事务或显式事务的结束。 如果 @ @TRANCOUNT 为1,则 COMMIT TRANSACTION 使得自从事务开始后进行的所有数据修改成为数据库的部分,释放事务的资源,并将 @ @TRANCOUNT 减为0。 如果 @ @TRANCOUNT 大于1,则 COMMIT TRANSACTION 会将 @ @TRANCOUNT 减为1,并且事务将保持活动状态。

ROLLBACK TRANSACTION

将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。 可以使用 ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。 它还释放由事务控制的资源。

这不包括对局部变量或表变量所做的更改。 该语句不会清除这些更改。

  • ROLLBACK TRANSACTION 语句不生成显示给用户的消息。 如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。 RAISERROR 是用于指出错误的语句。
  • 不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 将回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到外面的 BEGIN TRANSACTION 语句。 在这两种情况下,ROLLBACK TRANSACTION 都将 @@TRANCOUNT 系统函数减小为 0。 ROLLBACK TRANSACTIONsavepoint_name不会减小 @@TRANCOUNT。
  • 在事务内允许有重复的保存点名称,但如果 ROLLBACK TRANSACTION 使用重复的保存点名称,则只回滚到近的使用该保存点名称的 SAVE TRANSACTION。

@@TRANCOUN

BEGIN TRANSACTION 语句将 @@TRANCOUNT 增加 1。 ROLLBACK TRANSACTION @@TRANCOUNT为 0,但 ROLLBACK TRANSACTIONsavepoint_name,这不会影响@@TRANCOUNT。 COMMIT TRANSACTION 或 COMMIT WORK 将 @@TRANCOUNT 递减 1。

A. 使用显式事务

下面写法存在隐患,当操作(增删改)是由null引发的错误时,事务会跳过错误继续执行正常的语句

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;


B. 回滚事务

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;

C. 命名事务

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2012;  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO

D. 标记事务

BEGIN TRANSACTION CandidateDelete  
    WITH MARK N'Deleting a Job Candidate';  
GO  
USE AdventureWorks2012;  
GO  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
GO  
COMMIT TRANSACTION CandidateDelete;  
GO

E. 异常处理 begin try...end try...begin catch...end catch

begin tran
 begin try
    --sql语句1
    --sql语句2
    --sql语句3
 end try
 begin catch
    if @@trancount>
        rollback tran
 end catch
 if @@trancount>
    commit tran



引用:

分享好友

分享这个小栈给你的朋友们,一起进步吧。

SQLServer
创建时间:2023-03-20 14:06:14
美国Microsoft公司推出的一种关系型数据库系统。SQL Server是一个可扩展的、高性能的、为分布式客户机/服务器计算所设计的数据库管理系统,实现了与WindowsNT的有机结合,提供了基于事务的企业级信息管理系统方案。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

技术专家

查看更多
  • 飘絮絮絮丶
    专家
戳我,来吐槽~