听过几位同事说存储过程中的逻辑语句自动具有事务特性,即原子性,如果有错误就会全部自动回滚。
可是我用下面的简单的语句进行了验证,发现存储过程的语句并没有原子性,请看我的验证:
--表一
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 onbegin
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结果证明插入数据成功,如果这存储过程的语句具有原子性,它会自动回滚,那数据插入应该是失败的,
为什么有几位技术很牛的同事说存储过程语句具有原子性,它是不是需要其他的设置,使得这个存储过程
语句同事务一样,具有自动回滚功能,谢谢
可是我用下面的简单的语句进行了验证,发现存储过程的语句并没有原子性,请看我的验证:
--表一
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 onbegin
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结果证明插入数据成功,如果这存储过程的语句具有原子性,它会自动回滚,那数据插入应该是失败的,
为什么有几位技术很牛的同事说存储过程语句具有原子性,它是不是需要其他的设置,使得这个存储过程
语句同事务一样,具有自动回滚功能,谢谢
那拿BEGIN TRANS ,COMMIT TRANS 干什么
当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。http://tech.ccidnet.com/art/1106/20080311/1386403_1.html的描述
通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。
as
SET XACT_ABORT onbegin
begin tran
insert into dbo.T_Table1 values('Test')
insert into dbo.T_Test values(1,'Test')
insert into dbo.T_Test values(1,'Test2')
if @@error>0
RollBack TransAction
COMMIT TRAN
end事务更改