【问题标题】: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 中复制了虚拟数据。

标签: sql sql-server transactions commit rollback


【解决方案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 检查您的特定逻辑吗?
  • 假设我在尝试中运行更新。更新可能会工作,但我怎么知道它工作正常。是否应该包含检查约束以在提交之前验证更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多