看看这个网上流传的“sql server 事务举例”
2007-12-12 14:34
225 查看
CREATE PROCEDURE testPro
AS
BEGIN TRANSACTION tran_test
SAVE TRANSACTION tran_test
INSERT [table1] ( [content] ) VALUES ( '43332' )
COMMIT TRANSACTION tran_test
IF ( @@ERROR <> 0 )
BEGIN
RAISERROR( 'Insert data error!',16,1 )
ROLLBACK TRANSACTION tran_test
END
IF ( @@TRANCOUNT > 0 )
BEGIN
ROLLBACK TRANSACTION tran_test
END
GO
这个在网上流传的存储过程事务举例我也用过,可是今天拿出来一看,已经提交的事务还能回滚吗?
从直观上就是错误的,俺以为其中另有“隐情”,于是作了个测试,测试代码如下:
先建了一个表,并向其中添加了约束:
USE [test]
GO
/****** 对象: Table [dbo].[salary] 脚本日期: 12/12/2007 14:24:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[salary](
[id] [int] IDENTITY(1,1) NOT NULL,
[salary] [real] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[salary] WITH NOCHECK ADD CONSTRAINT [t1] CHECK (([salary]>=(1) AND [salary]<=(1)))
GO
ALTER TABLE [dbo].[salary] CHECK CONSTRAINT [t1]
然后新建了一个存储过程:
USE [test]
GO
/****** 对象: StoredProcedure [dbo].[tt] 脚本日期: 12/12/2007 14:25:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <风景年华>
-- Create date: <2007-12-12>
-- Description: <test>
-- =============================================
CREATE PROCEDURE [dbo].[tt]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
begin tran
save tran test
insert salary values (5)
if (@@error<>0)
begin
print '111'
rollback tran test
end
commit tran
END
再建一个存储过程:
USE [test]
GO
/****** 对象: StoredProcedure [dbo].[tt] 脚本日期: 12/12/2007 14:25:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <风景年华>
-- Create date: <2007-12-12>
-- Description: <test>
-- =============================================
CREATE PROCEDURE [dbo].[tt1]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
begin tran
save tran test
insert salary values (5)
commit tran
if (@@error<>0)
begin
print '111'
rollback tran test
end
END
两次测试结果:
1.
消息 547,级别 16,状态 0,过程 tt,第 17 行
INSERT 语句与 CHECK 约束"t1"冲突。该冲突发生于数据库"test",表"dbo.salary", column 'salary'。
语句已终止。
111
(1 行受影响)
结果中输出了 111
2.
消息 547,级别 16,状态 0,过程 tt1,第 17 行
INSERT 语句与 CHECK 约束"t1"冲突。该冲突发生于数据库"test",表"dbo.salary", column 'salary'。
语句已终止。
(1 行受影响)
结果中没有输出 111 表明没有执行存储过程
测试环境:sql server 2005 express
这是另外一个示例:
1,SqlServer存储过程的事务处理
一种比较通用的出错处理的模式大概如下:
Create procdure prInsertProducts
(
@intProductId int,
@chvProductName varchar(30),
@intProductCount int
)
AS
Declare @intErrorCode int
Select @intErrorCode=@@Error
Begin transaction
if @intErrorCode=0
begin
-insert products
insert products(ProductID,ProductName,ProductCount)
s(@intProductId,@chvProductName,@intProductCount)
Select @intErrorCode=@@Error --每执行完一条t-sql语句马上进行检测,并把错误号保存到局部变量中
end
if @intErrorCode=0
begin
-update products
update products set ProductName='MicroComputer' where ProductID=5
Select @intErrorCode=@@Error
end
if @intErrorCode=0
commit transaction
else
rollback transaction
Return @intErrorCode --最好返回错误代号给调用的存储过程或应用程序
2,.Net中使用事务处理
SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();
SqlTransaction myTrans = myConnection***ginTransaction(); //使用New新生成一个事务
SqlCommand myCommand = new SqlCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Update Address set location='23 rain street' where userid='0001'";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Record is udated.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Sorry, Record can not be updated.");
}
finally
{
myConnection.Close();
}
说明:在SqlServer中,每条Sql语句都作为一个事务来执行,所以无论在存储过程,还是在.net代码中使用,执行单条Sql语句没有必要使用事务处理,上面只是为了简化表达而对单条Sql语句使用事务处理
这就是俺的测试 初学sql 欢迎拍转
AS
BEGIN TRANSACTION tran_test
SAVE TRANSACTION tran_test
INSERT [table1] ( [content] ) VALUES ( '43332' )
COMMIT TRANSACTION tran_test
IF ( @@ERROR <> 0 )
BEGIN
RAISERROR( 'Insert data error!',16,1 )
ROLLBACK TRANSACTION tran_test
END
IF ( @@TRANCOUNT > 0 )
BEGIN
ROLLBACK TRANSACTION tran_test
END
GO
这个在网上流传的存储过程事务举例我也用过,可是今天拿出来一看,已经提交的事务还能回滚吗?
从直观上就是错误的,俺以为其中另有“隐情”,于是作了个测试,测试代码如下:
先建了一个表,并向其中添加了约束:
USE [test]
GO
/****** 对象: Table [dbo].[salary] 脚本日期: 12/12/2007 14:24:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[salary](
[id] [int] IDENTITY(1,1) NOT NULL,
[salary] [real] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[salary] WITH NOCHECK ADD CONSTRAINT [t1] CHECK (([salary]>=(1) AND [salary]<=(1)))
GO
ALTER TABLE [dbo].[salary] CHECK CONSTRAINT [t1]
然后新建了一个存储过程:
USE [test]
GO
/****** 对象: StoredProcedure [dbo].[tt] 脚本日期: 12/12/2007 14:25:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <风景年华>
-- Create date: <2007-12-12>
-- Description: <test>
-- =============================================
CREATE PROCEDURE [dbo].[tt]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
begin tran
save tran test
insert salary values (5)
if (@@error<>0)
begin
print '111'
rollback tran test
end
commit tran
END
再建一个存储过程:
USE [test]
GO
/****** 对象: StoredProcedure [dbo].[tt] 脚本日期: 12/12/2007 14:25:44 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <风景年华>
-- Create date: <2007-12-12>
-- Description: <test>
-- =============================================
CREATE PROCEDURE [dbo].[tt1]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
begin tran
save tran test
insert salary values (5)
commit tran
if (@@error<>0)
begin
print '111'
rollback tran test
end
END
两次测试结果:
1.
消息 547,级别 16,状态 0,过程 tt,第 17 行
INSERT 语句与 CHECK 约束"t1"冲突。该冲突发生于数据库"test",表"dbo.salary", column 'salary'。
语句已终止。
111
(1 行受影响)
结果中输出了 111
2.
消息 547,级别 16,状态 0,过程 tt1,第 17 行
INSERT 语句与 CHECK 约束"t1"冲突。该冲突发生于数据库"test",表"dbo.salary", column 'salary'。
语句已终止。
(1 行受影响)
结果中没有输出 111 表明没有执行存储过程
测试环境:sql server 2005 express
这是另外一个示例:
1,SqlServer存储过程的事务处理
一种比较通用的出错处理的模式大概如下:
Create procdure prInsertProducts
(
@intProductId int,
@chvProductName varchar(30),
@intProductCount int
)
AS
Declare @intErrorCode int
Select @intErrorCode=@@Error
Begin transaction
if @intErrorCode=0
begin
-insert products
insert products(ProductID,ProductName,ProductCount)
s(@intProductId,@chvProductName,@intProductCount)
Select @intErrorCode=@@Error --每执行完一条t-sql语句马上进行检测,并把错误号保存到局部变量中
end
if @intErrorCode=0
begin
-update products
update products set ProductName='MicroComputer' where ProductID=5
Select @intErrorCode=@@Error
end
if @intErrorCode=0
commit transaction
else
rollback transaction
Return @intErrorCode --最好返回错误代号给调用的存储过程或应用程序
2,.Net中使用事务处理
SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();
SqlTransaction myTrans = myConnection***ginTransaction(); //使用New新生成一个事务
SqlCommand myCommand = new SqlCommand();
myCommand.Transaction = myTrans;
try
{
myCommand.CommandText = "Update Address set location='23 rain street' where userid='0001'";
myCommand.ExecuteNonQuery();
myTrans.Commit();
Console.WriteLine("Record is udated.");
}
catch(Exception e)
{
myTrans.Rollback();
Console.WriteLine(e.ToString());
Console.WriteLine("Sorry, Record can not be updated.");
}
finally
{
myConnection.Close();
}
说明:在SqlServer中,每条Sql语句都作为一个事务来执行,所以无论在存储过程,还是在.net代码中使用,执行单条Sql语句没有必要使用事务处理,上面只是为了简化表达而对单条Sql语句使用事务处理
这就是俺的测试 初学sql 欢迎拍转
相关文章推荐
- 事务——sql server中的事务应用举例
- (转)看到网上有很多关于这个的帖子,但在执行“设置test数据库为紧急修复模式”时,SQL Server 2008总是失败。哪位大侠给个SQLServer 2008的有效方法。
- SQL Server 的事务和锁(举例)——在其他博客上做些笔误修改
- SQL Server中带事务的存储过程简单举例
- Myeclipse for spring9.0破解方法试验过同样适用于10-超简单明白 (使用网上流传的自动破解工具无法破解的可以使用这个) 亲测可用
- jbpm介绍,网上流传的哪个版本不全,这个版本我也是无意中知道的,希望作者理解。
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- 网上流传的一面试题目
- SQL Server 连接和事务相关的问题。
- SQL Server 2005系列教学_事务
- Sql Server 事务的两种用法
- sql server 事务操作
- SQL SERVER 查询性能优化——分析事务与锁(三)
- 今天22岁,对于30岁以前的一些事情,我思考了很久,后来却发现网上已经有前辈总结出来了,呵呵,贴出来大家一起看看
- Linux上安装Redis(Ubuntu16.04+Redis3.2.8)最烦网上流传的那些根本走不通的教程
- 看看这个超级实用的一种类型——匿名类型
- Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程
- 不知谁给我留的言,要招DNN 程序员,会这个的朋友可以看看
- 《SQL Server 2005技术内幕:T-SQL程序设计》:继续抄录事务、错误处理、Service Broker等三章中的部分内容