【发布时间】:2015-03-22 03:55:57
【问题描述】:
我有存储过程 sp_Insert 有 2 个选项,例如。 INSERT INTO Table1 和 INSERT INTO Table2。
我已经声明了 3 个变量 @choice(可以是 1、2 或 3)、@insertDataToTable1 和 @insertDataToTable2 作为输入。
所以代码结构如下:
CREATE PROC sp_MyProc
@choice...
@insertDataToTable1...
@insertDataToTable2...
AS
BEGIN TRAN
IF(@choice = 1 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
ELSE IF (@choice = 2 OR @choice = 3)
BEGIN
BEGIN TRY
//my query to insert to Table 1
END TRY
BEGIN CATCH
// print error
ROLLBACK //should rollback transaction
RETURN
END CATCH
END
COMMIT
所以如果@choice = 1 只运行第一个查询(插入到 table1),如果@choice = 2 只运行第二个查询(插入到第二个表),如果 @choice = 3 运行第一个和第二个查询以将数据库插入到第一个和第二张桌子。
问题:
一切都会好起来的,除了交易问题。 交易不回滚 如果其中一个块失败。我的意思是如果第一个查询成功(将数据插入到 table1)并且第二个查询失败(例如主键问题)它没有回滚,值保持插入到 table1。问题出在哪里?
【问题讨论】:
-
旁注:
CREATE PROCEDURE:“在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。”
标签: sql sql-server tsql stored-procedures transactions