关于存储过程逻辑具有事务特性的疑问,请大侠们进来讨论下
听过几位同事说存储过程中的逻辑语句自动具有事务特性,即原子性,如果有错误就会全部自动回滚。
可是我用下面的简单的语句进行了验证,发现存储过程的语句并没有原子性,请看我的验证:
--表一
CREATE TABLE [dbo].[T_Table1](
[Column1] [int] IDENTITY(1,1) NOT NULL, --主键,自增
[Column2] [nvarchar](50) NULL,
CONSTRAINT [PK_T_Table1] PRIMARY KEY NONCLUSTERED
(
[Column1] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
)
--表二
CREATE TABLE [dbo].[T_Test](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
CONSTRAINT [PK_T_Test] 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]
)
--存储过程
Create proc P_TestProc
as
SET XACT_ABORT on
begin
insert into dbo.T_Table1 values('Test')
insert into dbo.T_Test values(1,'Test')--
insert into dbo.T_Test values(1,'Test2')--违反表一的主键约束
end
--执行
exec P_TestProc
--提示
(1 行受影响)
消息 2627,级别 14,状态 1,过程 P_TestProc,第 7 行
违反了 PRIMARY KEY 约束 'PK_T_Test'。不能在对象 'dbo.T_Test' 中插入重复键。
--执行
select * from T_Table1
--结果
Column1 Column2
1 Test
结果证明插入数据成功,如果这存储过程的语句具有原子性,它会自动回滚,那数据插入应该是失败的,
为什么有几位技术很牛的同事说存储过程语句具有原子性,它是不是需要其他的设置,使得这个存储过程
语句同事务一样,具有自动回滚功能,谢谢