存储回滚
CREATE PROC [dbo].[notice_Delete] --- 同时删除该通知书和对应的节点
@tbl VARCHAR(30),
@pid INT
AS
BEGIN
DECLARE @tblname VARCHAR(30) ;
DECLARE @sql VARCHAR(1000) ;
SET @tblname = @tbl
SET @sql = 'delete ' + @tblname + ' where id ='
+ CONVERT(VARCHAR(10), @pid)
BEGIN TRAN --开始事务
EXEC ( @sql
)
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
DELETE FROM tbl_treenotice
WHERE purposeid = @pid
IF ( @@rowcount = 0 ) --执行结果影响行数为0
BEGIN
ROLLBACK TRAN --回滚
END
ELSE
BEGIN
COMMIT TRAN --提交事务
END
END
END
❷ SQL SERVER 存储过程 回滚
CREATE PROCEDURE test
@name varchar(50)
ASBEGIN
SET NOCOUNT ON;begin transaction;
delete from part where partname=@name;
delete from users where pwd=@name
if @@error<>0 or @@rowcount = 0
begin print 'rollback';
rollback transaction; end
else
begin print 'commit';
COMMIT transaction ;
ENDend
❸ SQL存储过程,如何回滚啊
当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。
当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。OFF 是默认设置。
编译错误(如语法错误)不受 SET XACT_ABORT 的影响。
对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。有关详细信息,请参阅 分布式查询和分布式事务。
SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。
示例
下列代码示例导致在含有其他 Transact-SQL 语句的事务中发生外键冲突错误。在第一个语句集中产生错误,但其他语句均成功执行且事务成功提交。在第二个语句集中,将 SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止,并使事务回滚。
复制代码
USE AdventureWorks;
GO
IF OBJECT_ID(N't2', N'U') IS NOT NULL
DROP TABLE t2;
GO
IF OBJECT_ID(N't1', N'U') IS NOT NULL
DROP TABLE t1;
GO
CREATE TABLE t1
(a INT NOT NULL PRIMARY KEY);
CREATE TABLE t2
(a INT NOT NULL REFERENCES t1(a));
GO
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (3);
INSERT INTO t1 VALUES (4);
INSERT INTO t1 VALUES (6);
GO
SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (1);
INSERT INTO t2 VALUES (2); -- Foreign key error.
INSERT INTO t2 VALUES (3);
COMMIT TRANSACTION;
GO
SET XACT_ABORT ON;
GO
BEGIN TRANSACTION;
INSERT INTO t2 VALUES (4);
INSERT INTO t2 VALUES (5); -- Foreign key error.
INSERT INTO t2 VALUES (6);
COMMIT TRANSACTION;
GO
-- SELECT shows only keys 1 and 3 added.
-- Key 2 insert failed and was rolled back, but
-- XACT_ABORT was OFF and rest of transaction
-- succeeded.
-- Key 5 insert error with XACT_ABORT ON caused
-- all of the second transaction to roll back.
SELECT *
FROM t2;
GO
❹ 存储过程回滚 急
BEGIN TRY
END
BEGIN CATCH
END CATCH
用这个试试呢
❺ sqlserver 存储过程事务回滚怎么写
begin tran
。。。。。。
在存储过程后面加上:
if @@error<>0
rollback tran
else
commit tran
❻ 用存储过程实现回滚
程序功能
在SQL Server数据库中建立两个表:USER表和USERDOC表。其中USER表中存放的是注册用户的用户名和密码,USERDOC表中存放的是该注册用户的个人资料,并且以用户名为索引。下面是表USER和USERDOC的定义:
Create Table USER(userName varchar(30),userPasswd varchar(30))
Create Table USERDOC(userName varchar(30),Age int,Sex int,PhoneNumber varchar(20),Address varchar(50))
当用户请求注册时,ASP脚本先将用户名和密码插入到USER表中,然后在USERDOC表中插入用户个人信息(年龄、性别、联系电话和家庭住址等)。同时,应用程序还必须保证USER表中的每一条记录在USERDOC表中都有相应的记录。
利用ASP内置ADO组件中的Connection对象可以实现对数据库操作的事务性处理。Connection对象的部分方法如下:
●Connection.BeginTrans方法:启动一个事务;
●Connection.CommitTrans方法:完成/提交一个事务;
●Connection.RollBackTrans方法:撤消/放弃一个事务。
//启动一个事务操作
<% Conn.BeginTrans %>
<% sqlText=“Insert into USER(userName,userPasswd) values(‘” %>
<% sqlText=sqlText & request(“usrName”) & “’,‘”&request(“usrPasswd”)&“’) ” %>
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
//如果插入数据操作失败,则事务向前回滚
<% conn.RollBackTrans %>
<% response.Redirct RegisterFail.html %>
<% end if %>
<% sqlText=“Insert into USERDOC(userName,Age,Sex,PhoneNumber,Address) ”%>
<% sqlText=sqlText & “values(‘”& request
(“usrName”) & “’, ” & request(“Age”) %>
<% sqlText=sqlText & “,‘” & request
(“PhoneNum”) & “’,‘” %>
<% sqlText=sqlText & request(“Address”) & “’) ” %>
//执行事务单元中的第二条插入语句
<% conn.execute(sqlText) %>
<% if conn.Errors.Count>0 then %>
<% conn.Errors.Clear %>
//如果操作失败,则事务向前回滚
<% conn.RollBackTrans %>
<% response.Redirct RegisterFail.html %>
<% end if %>
//如果整个事务操作执行正确,则提交事务
<% Conn.CommitTrans %>
//转向注册成功处理页面
<% response.Redirct RegisterOk.html %>
❼ 存储过程与事物回滚的问题
答案是:任何情况下的事务嵌套.只要任何地方出错,全回滚.
事务组合一系列任务为一个执行单元。每个事务以特定的任务开始,以特定的任务结束。当所有的任务成功时事务成功,当任何一个任务失败时,事务失败。所以一个事务只有两个结果:失败或成功。
请参考:《SQL Server的事务和错误处理》:
http://www.it118.org/specials/c9fba99e-4401-49cf-8256-ac3c1a34c0d9/33827942-5e09-42f9-a409-235a099616b3.htm
❽ 如何在ORACLE 存储过程中设置回滚断点
学习存储过程中使用断点回滚事务时,发现目前网络上存在一个问题,那就是使用断点回滚后,都忘记了一个很重要的事情,提交事务。虽然使用了断点回滚,但是断点回滚不像rollBack或commit一样结束当前事务,而使用断点回滚只会回滚到声明断点的地方,之前的产生的事务仍需要提交的,如果不提交,事务一直在数据库中缓存.
Demo:
procere doSomeThing(p_number out number) as
begin
insert into t_test_user_mingming(id,loginname,password,realname,type)
values(se_test_user_mingming_id.nextval,'xiaoming','1234','小明',1);
p_number := 1;
savepoint ps;--- 设置断点 ps
insert into t_test_info_mingming(id,pal,type,create_time,note)
values(se_test_info_id.nextval,'我想买台thinkPad 可以俺莫有钱',1,sysdate,'ceshi');
p_number := 2;
savepoint sp;----设置断点 sp
insert into t_test_agent(agent_id) values(1);---我这里此行会抛出异常 ORA-01400 可以替换为下句 手动抛出一个异常
-----RAISE_APPLICATION_ERROR (-20004,'抛出的异常玩玩');
commit;
exception --捕获异常
when others then
rollback to ps; ---- 如果产生异常,回滚到断点 ps
p_number :=0;
commit; --- 提交事务
end doSomeThing;
这里本人做了实验,如果在异常中不加 commit 语句,使用PL/SQL测试时,异常在缓存,t_test_user_mingming 表中没有数据记录。
存储过程里的事务操作:
create or replace procere pr_mypro2(p_a in varchar2,p_b in varchar2,p_count out number)
temp varchar2(1000); /*定义临时变量*/
is
begin
select code into p_count from table1 where a=p_a; /*查询并返回值*/
temp := p_count; /*将返回值赋给临时变量*/
savepoint point1; /*保存点*/
insert into table2(a,b)values(temp,p_b); /*将临时变量值添加到新表的字段*/
savepoint point2;
insert into
exception
when others then
rollback to savepoint point1; /*异常处理,保存点下面的操作都不会被执行*/
return;
end;
保存点(SAVEPOINT)是事务处理过程中的一个标志,与回滚命令(ROLLBACK)结合使用,主要的用途是允许用户将某一段处理回滚而不必回滚整个事务。
如果定义了多个savepoint,当指定回滚到某个savepoint时,那么回滚操作将回滚这个savepoint后面的所有操作(即使后面可能标记了N个savepoint)。
例如,在一段处理中定义了五个savepoint,从第三个savepoint回滚,后面的第四、第五个标记的操作都将被回滚,如果不使用ROLLBACK TO savepoint_name而使用ROLLBACK,将会滚整个事务处理。
❾ 存储过程的问题 回滚
看你程序怎么写的,如果循环中每次插入每次提交自然回滚不了了,一般来说是整个作为一个事务,在发生错误异常处理时候做ROLLBACK。存储过程自己没有回滚功能,要你在程序中控制事务完整性的。如果你不写commit也不写rollback的话,自动作为一个事务整体会失败,事务自动回滚,如果执行成功,事务结束则自动提交。
❿ oracle 存储过程更改了怎么回滚
create or replace procere my_update(vempno in number,vsal in number)as vint stu.sal%type:=vsal; my_exception exception; rint stu.sal%type;begin update stu set sal = vint where empno = vempno; select sal into rint from stu where empno = vempno; if rint<>0 then raise my_exception; end if; exception when my_exception then rollback;