【发布时间】:2015-03-16 21:41:56
【问题描述】:
长期以来,我一直忽略使用 SQL 事务,主要是出于无知。
但是假设我有一个这样的程序:
CREATE PROCEDURE CreatePerson
AS
BEGIN
declare @NewPerson INT
INSERT INTO PersonTable ( Columns... ) VALUES ( @Parameters... )
SET @NewPerson = SCOPE_IDENTITY()
INSERT INTO AnotherTable ( @PersonID, CreatedOn ) VALUES ( @NewPerson, getdate() )
END
GO
在上面的示例中,第二个插入依赖于第一个,因为如果第一个失败,它将失败。
其次,无论出于何种原因,就正确实施而言,交易让我感到困惑。我在这里看到了一个例子,在那儿看到了另一个例子,我刚刚打开了 Adventureworks 以找到另一个示例,包括 try、catch、rollback 等。
我没有记录错误。我应该在这里使用交易吗?这值得么?
如果是这样,应该如何正确实施?根据我看到的例子:
CREATE PROCEURE CreatePerson
AS
BEGIN TRANSACTION
....
COMMIT TRANSACTION
GO
或者:
CREATE PROCEDURE CreatePerson
AS
BEGIN
BEGIN TRANSACTION
COMMIT TRANSACTION
END
GO
或者:
CREATE PROCEDURE CreatePerson
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION
...
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION
END
END CATCH
END
最后,在我的真实代码中,我有更多的 5 个单独的插入,全部基于新生成的人员 ID。如果你是我,你会怎么做?这个问题可能是多余的或重复的,但无论出于何种原因,我似乎无法在脑海中调和处理这个问题的最佳方法。
另一个令人困惑的领域是回滚。如果必须将事务作为单个操作单元提交,如果不使用回滚会发生什么?还是只有在类似于 vb.net/c# 错误处理的 Try/Catch 中才需要回滚?
【问题讨论】:
标签: sql-server transactions sql-server-2012