我用两个假设的程序来完成整个过程。充分测试和使用它。我希望在这段时间之后能解决,因为问题是三年前的问题。
1.第一步创建两个表:
CREATE TABLE [dbo].[Products](
[ProductId] [nvarchar](70) NOT NULL,
[ItemId] [nvarchar](50) NOT NULL,
[Color] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_table_4] PRIMARY KEY CLUSTERED
(
[ProductId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Users](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](20) NULL,
[NewColumn] [nchar](10) NULL,
CONSTRAINT [P_Users_Id] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
- 创建 3 个存储过程(ProductID 不是身份,我不使用它来生成测试错误):
--SP1
Create PROCEDURE [dbo].[usp_adduser]
@name nvarchar(20),
@new nchar(10)
AS
BEGIN
SET NOCOUNT ON;
insert into users
values (@name,@new)
END
GO
--SP2
Create PROCEDURE [dbo].[usp_addproduct]
@itemid nvarchar(50),
@color nvarchar(50)
--,@Productid int = null --for test commnted
AS
BEGIN
SET NOCOUNT ON;
insert into products ([ItemId], [Color]) --dont use producid for test
values (@itemid,@color)
END
GO
--SP3
Create PROCEDURE [dbo].[usp_addmix]
@itemid nvarchar(50),
@color nvarchar(50),
@name nvarchar(20),
@new nchar(10)
AS
SET NOCOUNT ON;
Set Implicit_transactions ON;
Begin transaction
Execute usp_adduser @name,@new
Execute usp_addproduct @itemid,@color
Commit transaction
Catch
if @@TRANCOUNT > 0
rollback
- 输入虚假数据
EXEC [dbo].[usp_addmix]
@itemid = N'1',
@color = N'red',
@name = N'ali',
@new = N'test'
它运作良好。
当第一个过程正确而后一个过程错误时,或者反之亦然,回滚操作对两者都适用。