事务回滚后不会继续向下执行

__lhy 2014-04-11 04:30:50
CREATE PROCEDURE [dbo].[UpdateMyInfo]
@Optype int,--0 新增 1修改 2删除
@No int,
@Name varchar(50)
AS
declare @Ret int
set @Ret=-1
if @Optype=0
begin
set xact_abort on
begin tran
insert into myinfo([Name]) values(@Name)
set @Ret=0
commit
end
return @Ret

其中myinfo
No为自动编号类型
Name设置为主键
如果Name重复就会报错,现在如果报错return @Ret就不会执行?
...全文
766 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
__lhy 2014-04-12
  • 打赏
  • 举报
回复
引用 12 楼 x_wy46 的回复:
[quote=引用 10 楼 qq752923276 的回复:] [quote=引用 8 楼 guguda2008 的回复:] [quote=引用 7 楼 qq752923276 的回复:] [quote=引用 5 楼 guguda2008 的回复:] [quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事[/quote] 这个选项开了就是出错就回滚,不管严重级别
set xact_abort on
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT
go
SELECT *
from #t

DROP TABLE #T
[/quote] 我在《查询分析器》下调用 确实没有执行后面的语句 declare @Ret int exec @Ret=updatemyinfo 0,0,'信息' print '123' 服务器: 消息 2627,级别 14,状态 1,过程 Updatemyinfo,行 13 违反了 PRIMARY KEY 约束 'PK_my_info'。不能在对象 'PK_my_info' 中插入重复键。 没有输出print '123' 的123[/quote] 你在存储过程中没有做异常处理 程序运行到存储过程哪里被打断了,相当于程序“走投五路” 加上异常处理的慢,即便是发生了异常,对于程序来说,他是有路可走的,不是不处理异常,造成程序“五无路可走” 你试试

alter PROCEDURE [dbo].[UpdateMyInfo]
@Optype int,--0 新增 1修改 2删除
@No int,
@Name varchar(50)
AS
declare @Ret int
set @Ret=-1
if @Optype=0
begin
    set xact_abort on
    begin try
    begin tran
    insert into myinfo([Name]) values(@Name)
    set @Ret=0
    commit
    end try
    
    begin catch
		rollback
    end catch
end
return @Ret

再来


declare @Ret int
exec @Ret=updatemyinfo 0,0,'信息'--传递一个插入不成功的参数
print '123'

--这个肯定可以走下来的


[/quote] 谢谢 sql2000不支持trycatch怎么办
专注or全面 2014-04-11
  • 打赏
  • 举报
回复
引用 10 楼 qq752923276 的回复:
[quote=引用 8 楼 guguda2008 的回复:] [quote=引用 7 楼 qq752923276 的回复:] [quote=引用 5 楼 guguda2008 的回复:] [quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事[/quote] 这个选项开了就是出错就回滚,不管严重级别
set xact_abort on
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT
go
SELECT *
from #t

DROP TABLE #T
[/quote] 我在《查询分析器》下调用 确实没有执行后面的语句 declare @Ret int exec @Ret=updatemyinfo 0,0,'信息' print '123' 服务器: 消息 2627,级别 14,状态 1,过程 Updatemyinfo,行 13 违反了 PRIMARY KEY 约束 'PK_my_info'。不能在对象 'PK_my_info' 中插入重复键。 没有输出print '123' 的123[/quote] 你在存储过程中没有做异常处理 程序运行到存储过程哪里被打断了,相当于程序“走投五路” 加上异常处理的慢,即便是发生了异常,对于程序来说,他是有路可走的,不是不处理异常,造成程序“五无路可走” 你试试

alter PROCEDURE [dbo].[UpdateMyInfo]
@Optype int,--0 新增 1修改 2删除
@No int,
@Name varchar(50)
AS
declare @Ret int
set @Ret=-1
if @Optype=0
begin
    set xact_abort on
    begin try
    begin tran
    insert into myinfo([Name]) values(@Name)
    set @Ret=0
    commit
    end try
    
    begin catch
		rollback
    end catch
end
return @Ret

再来


declare @Ret int
exec @Ret=updatemyinfo 0,0,'信息'--传递一个插入不成功的参数
print '123'

--这个肯定可以走下来的


--小F-- 2014-04-11
  • 打赏
  • 举报
回复
SET XACT_ABORT ON 开启以后 是只要出现错误就回滚。当然不可以输出结果了
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 8 楼 guguda2008 的回复:
[quote=引用 7 楼 qq752923276 的回复:] [quote=引用 5 楼 guguda2008 的回复:] [quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事[/quote] 这个选项开了就是出错就回滚,不管严重级别
set xact_abort on
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT
go
SELECT *
from #t

DROP TABLE #T
[/quote] 我在《查询分析器》下调用 确实没有执行后面的语句 declare @Ret int exec @Ret=updatemyinfo 0,0,'信息' print '123' 服务器: 消息 2627,级别 14,状态 1,过程 Updatemyinfo,行 13 违反了 PRIMARY KEY 约束 'PK_my_info'。不能在对象 'PK_my_info' 中插入重复键。 没有输出print '123' 的123
__lhy 2014-04-11
  • 打赏
  • 举报
回复
我在《查询分析器》下调用 确实没有执行后面的语句 declare @Ret int exec @Ret=updatemyinfo 0,0,'信息' print '123' 服务器: 消息 2627,级别 14,状态 1,过程 Updatemyinfo,行 13 违反了 PRIMARY KEY 约束 'PK_my_info'。不能在对象 'PK_my_info' 中插入重复键。 没有输出print '123' 的123
guguda2008 2014-04-11
  • 打赏
  • 举报
回复
引用 7 楼 qq752923276 的回复:
[quote=引用 5 楼 guguda2008 的回复:] [quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事[/quote] 这个选项开了就是出错就回滚,不管严重级别
set xact_abort on
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT
go
SELECT *
from #t

DROP TABLE #T
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 5 楼 guguda2008 的回复:
[quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 5 楼 guguda2008 的回复:
[quote=引用 4 楼 qq752923276 的回复:] [quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
[/quote] 你好 我发现跟我启用出错中断标志有关 set xact_abort on 请问这是怎么回事
guguda2008 2014-04-11
  • 打赏
  • 举报
回复
引用 4 楼 qq752923276 的回复:
[quote=引用 1 楼 guguda2008 的回复:] 插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢[/quote]
CREATE TABLE #T(ID INT)
BEGIN TRAN
insert into #t 
select 2
INSERT INTO #T
SELECT 1/0
insert into #t
select 3
PRINT 'A'
COMMIT

SELECT *
from #t

DROP TABLE #T
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 1 楼 guguda2008 的回复:
插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 1 楼 guguda2008 的回复:
插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢
__lhy 2014-04-11
  • 打赏
  • 举报
回复
引用 1 楼 guguda2008 的回复:
插入失败的严重性不高,会继续往下执行的
我在查询分析器中用“服务器跟踪”查看没有继续执行呢
guguda2008 2014-04-11
  • 打赏
  • 举报
回复
插入失败的严重性不高,会继续往下执行的

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧