数据库中的rollback怎么个使用法。。。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库中的rollback怎么个使用法。。。相关的知识,希望对你有一定的参考价值。

rollback 回滚的意思。 就是数据库里做修改后 ( update ,insert , delete)未commit 之前 使用rollback 可以恢复数据到修改之前。 参考技术A 1>
2> select * from test_main
3> go
id value
----------- ----------
1 ONE
2 TWO
3 THREE
(3 行受影响)

1> BEGIN TRY
2> -- SQL Server 需要显示的定义 开始一个事务.
3> BEGIN TRANSACTION;
4> -- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
5> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7> -- 执行成功后,需要提交事务.
8> COMMIT;
9> END TRY
10> BEGIN CATCH
11> PRINT('Main.错误代码 = ' + STR(ERROR_NUMBER()));
12> PRINT('Main.错误严重级别 = ' + STR(ERROR_SEVERITY()));
13> PRINT('Main.错误状态代码 = ' + STR(ERROR_STATE()));
14> PRINT('Main.错误信息 = ' + ERROR_MESSAGE());
15> -- 回滚事务
16> ROLLBACK;
17> END CATCH
18>
19> go
(1 行受影响)
Main.错误代码 = 2627
Main.错误严重级别 = 14
Main.错误状态代码 = 1
Main.错误信息 = 违反了 PRIMARY KEY 约束 'PK__test_main__47DBAE45'。不能在对象 'd
bo.test_main' 中插入重复键。
1> select * from test_main;
2> go
id value
----------- ----------
1 ONE
2 TWO
3 THREE

(3 行受影响)

参考资料:http://hi.baidu.com/wangzhiqing999/blog/item/b2494d50cee15856d0090649.html

参考技术B --Transaction 回滚 数据库里做修改后 可以恢复数据到修改之前

begin tran

insert into student(stuname,age,classes,dormno)    values('张十',18,'软件1723',1101);

select*from student;
--commit tran;

rollback tran

select*from student;

OracleTransaction.Rollback() 是不是取代存储过程中的提交?

【中文标题】OracleTransaction.Rollback() 是不是取代存储过程中的提交?【英文标题】:Does the OracleTransaction.Rollback() supercedes commit in stored procedure?OracleTransaction.Rollback() 是否取代存储过程中的提交? 【发布时间】:2017-06-01 16:03:09 【问题描述】:

假设我的代码包含从 c# 代码执行的多个存储过程。每个存储过程都有一个提交和一个在异常情况下的回滚。异常在这些存储过程中进行处理并返回已处理的错误消息。

如果我有一个“正在运行”的 OracleTransaction.BeginTransaction(),则在执行存储过程时,在同一连接对象上,c# 代码中的 OracleTransaction.Rollback() 实际上会回滚先前执行的存储过程提交的数据。

逻辑如下:

    打开连接 开始交易 执行一个存储过程(内部有提交) 如果一切正常,执行另一个存储过程(带提交)。如果没有,则回滚之前的存储过程并完全停止。 没有错误提交事务。 谢谢。

【问题讨论】:

您似乎以非标准方式使用术语“事务”(与使用数据库的上下文中的技术含义不一致)。您不会在“事务”中“执行存储过程”;相反,相反。你只能提交一个事务——一旦提交,它就不能回滚。问题是,如果第二个过程中的某些事情可能要求您撤消在第一个过程中所做的事情,那么为什么要在第一个过程结束时使用 COMMIT 呢? 有人知道OracleTransaction.BeginTransaction 是做什么的吗?通过快速搜索,我只能找到它'在数据库中开始事务'。但是,在 Oracle 中没有特殊的命令可以做到这一点。我怀疑它什么都不做,纯粹是为了与其他 RDBMS 产品兼容。 @mathguy 不幸的是,这是我必须处理的数据结构,它部分是无法解决的设计问题。第二个过程曾经在第一个过程中,并将在其中提交。该查询必须被取出到它自己的 SP 中,但是数据是相互依赖的,如果第二个失败首先也需要回滚。我希望实现嵌套事务,因为这是我唯一想到的。但是,我确实找到了这个***.com/questions/24506847/…,它基本上解决了这个问题。 【参考方案1】:

COMMIT 结束当前事务,新事务从下一个可执行 SQL 语句开始。因此,后续的ROLLBACK 只能撤消之前的COMMIT 所做的更改,但不能撤消之前的

【讨论】:

以上是关于数据库中的rollback怎么个使用法。。。的主要内容,如果未能解决你的问题,请参考以下文章

数据库中 rollback 和 commit 是啥时候用的 作用是啥 有啥区别 举几个简单的

oracle中,已commit的数据能rollback回滚吗?

thinkphp rollback没有回滚数据库为啥

oracle中的commit和rollback

SQL语句如何rollback

mysql binlog 中的 为啥会有 rollback