如何知道何时提交或回滚事务

Posted

技术标签:

【中文标题】如何知道何时提交或回滚事务【英文标题】:How to know when to Commit or Rollback a Transaction 【发布时间】:2018-05-27 18:19:53 【问题描述】:

我正在尝试了解如何以及何时提交 /rollback 事务。 我正在使用IF 条件来测试代码是否产生错误,如果是,我想回滚。

测试代码的最佳方法是什么,以便您知道何时提交或回滚。

我试过下面的代码,但我得到了这个错误

消息 102,级别 15,状态 1,第 5 行 '*' 附近的语法不正确。

Begin Transaction DBChallenge1Setup
 Create Table EmployeeRecords(
                            EmployeeID varchar(50) PRIMARY KEY
                            PpsNo varchar(8),
                            FirstName varchar(50),
                            LastName varchar(50),
                            Department varchar(50),
                            SupervisorId varchar(50),
                            PhoneNo varchar(50),
                            EmailAddress varchar(50),
                            DateOfBirth date);
Insert Into EmployeeRecords
                    Values(1, '5686213Q', 'Dan', 'Roche', 'IT',232, '012323232', 'danroche@itsolutions.com', '1970-04-10'),
                            (2, '6534223Q', 'Nicholas', 'Martin', 'IT',233, '012323233', 'nicholasmartin@itsolutions.com', '1974-12-01'),
                            (232, '9514223W', 'Jane', 'Donnelly', 'IT',999, '012323234', 'janedonnelly@itsolutions.com', '1960-02-12'),
                            (233, '4212223S', 'Amy', 'Smythe', 'IT',999, '012323235', 'amysmythe@itsolutions.com', '1967-09-11');

Select * From EmployeeRecords
Select @@Rowcount As RecordsEntered, @@ERROR As Errors
if @@Error > 0 ROLLBACK Transaction DBChallenge1Setup
if @@Error = 0 Commit Transaction DBChallenge1Setup;

【问题讨论】:

您使用的是什么关系型数据库?此外,* 给你一个错误。去掉它。并且您的 create 语句中的列之间没有 , 如何使用Try Catch 块。 我正在使用 SSMS。我已经添加了逗号。我需要 * 因为我想返回所有列。我不熟悉 Try Catch。但会查一下。我尝试先正确使用 Commit/Rollback。 CREATE 语句中 PRIMARY KEY 旁边的 * 就是我所说的删除。 对不起。我见过。我从 word doc 中复制了虚拟数据。 【参考方案1】:

我建议使用try/catch 来处理意外错误;

begin try
Begin Transaction DBChallenge1Setup
 Create Table EmployeeRecords(
                            EmployeeID varchar(50,) PRIMARY KEY
                            PpsNo varchar(8),
                            FirstName varchar(50),
                            LastName varchar(50),
                            Department varchar(50),
                            SupervisorId varchar(50),
                            PhoneNo varchar(50),
                            EmailAddress varchar(50),
                            DateOfBirth date)
Insert Into EmployeeRecords
                    Values(1, '5686213Q', 'Dan', 'Roche', 'IT',232, '012323232', 'danroche@itsolutions.com', '1970-04-10'),
                            (2, '6534223Q', 'Nicholas', 'Martin', 'IT',233, '012323233', 'nicholasmartin@itsolutions.com', '1974-12-01'),
                            (232, '9514223W', 'Jane', 'Donnelly', 'IT',999, '012323234', 'janedonnelly@itsolutions.com', '1960-02-12'),
                            (233, '4212223S', 'Amy', 'Smythe', 'IT',999, '012323235', 'amysmythe@itsolutions.com', '1967-09-11');
Commit Transaction DBChallenge1Setup;
end try
begin catch
   ROLLBACK Transaction DBChallenge1Setup
end catch

您应该在 catch 块内回滚事务。此外,最好使用 ERROR_MESSAGE() ERROR_SEVERITY() 等在 catch 块中记录发生的错误详细信息。

【讨论】:

在使用commit之前怎么知道tran是成功的 TRY 将控制是commit 还是转到CatchTRY 表示试试看,如果不行就去Catch 我的意思是尝试可能有效,但可能无法正常工作。在提交之前你怎么知道输入的数据是正确的 "输入的数据是正确的"什么意思?您想从 SQL Server 检查您的特定逻辑吗? 假设我在尝试中运行更新。更新可能会工作,但我怎么知道它工作正常。是否应该包含检查约束以在提交之前验证更新

以上是关于如何知道何时提交或回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

oracle 提交事务后为啥不能撤销或回滚,不是有撤销段吗

Access 2007 表单错误:您尝试提交或回滚事务

mysql事务未commit

切分大任务成多个子任务(事务),汇总后统一提交或回滚

知识点:Spring嵌套事务方式

分布式事务:Seata框架AT模式及TCC模式执行流程剖析