当前位置:首页 » 数据仓库 » 数据库rollback
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

数据库rollback

发布时间: 2022-05-29 16:36:38

1. 对于一个key-value类型的数据库,如何设计数据库的rollback操作

1、检查key是否存在,存在的话,将老的value先临时保存,然后执行set操作,rollback的时候,将原来的value再set回去

2、key不存在,先执行set操作,rollback的时候,del掉key

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

COMMIT是表示【提交】,就是提交事务的所有操作。
具体地说,就是将事务中的所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK指的是【回滚】,即是在事务的运行过程中,发生了某种故障,事务不能继续执行,系统将事务中对数据库的所有的已完成的操作全部撤销,回滚到事务开始之前的状态。
总之,就是一个成功,一个不成功

3. mysql binlog 中的 为什么会有 rollback

当启动Binlog后,事务会产生Binlog Event,这些Event被看做事务数据的一部分。因此要保证事务的Binlog Event和InnoDB引擎中的数据的一致性。所以带Binlog的CrashSafe要求MySQL宕机重启后能够保证:

- 所有已经提交的事务的数据仍然存在。

- 所有没有提交的事务的数据自动回滚。

- 所有已经提交了的事务的Binlog Event也仍然存在。

- 所有没有提交事务没有记录Binlog Event。

这些要求很好理解,如果重启后数据还在,但是Binlog Event没有了,就没办法复制到其他节点上了。如果重启后,数据没了,但是Binlog Event还在,那么不存在的数据就会被复制到其他节点上,从而导致主从的不一致。

为了保证带Binlog的CrashSafe,MySQL内部使用的两阶段提交(Two Phase Commit)。

2 - MySQL的Two Phase Commit(2PC)

在开启Binlog后,MySQL内部会自动将普通事务当做一个XA事务来处理:
- 自动为每个事务分配一个唯一的ID
- COMMIT会被自动的分成Prepare和Commit两个阶段。
- Binlog会被当做事务协调者(Transaction Coordinator),Binlog Event会被当做协调者日志。
想了解2PC,可以参考文档:【https://en.wikipedia.org/wiki/Two-phase_commit_protocol。】

- 分布式事务ID(XID)

使用2PC时,MySQL会自动的为每一个事务分配一个ID,叫XID。XID是唯一的,每个事务的XID都不相同。XID会分别被Binlog和InnoDB记入日志中,供恢复时使用。MySQ内部的XID由三部分组成:

- 前缀部分

前缀部分是字符串"MySQLXid"

- Server ID部分

当前MySQL的server_id
- query_id部分

为了保证XID的的唯一性,数字部分使用了query_id。MySQL内部会自动的为每一个语句分配一个query_id,全局唯一。

参考代码:sql/xa。h的struct xid_t结构。

- 事务的协调者Binlog

Binlog在2PC中充当了事务的协调者(Transaction Coordinator)。由Binlog来通知InnoDB引擎来执行prepare,commit或者rollback的步骤。事务提交的整个过程如下:

1. 协调者准备阶段(Prepare Phase)

告诉引擎做Prepare,InnoDB更改事务状态,并将Redo Log刷入磁盘。

2. 协调者提交阶段(Commit Phase)

2.1 记录协调者日志,即Binlog日志。

2.2 告诉引擎做commit。
注意:记录Binlog是在InnoDB引擎Prepare(即Redo Log写入磁盘)之后,这点至关重要。

在MySQ的代码中将协调者叫做tc_log。在MySQL启动时,tc_log将被初始化为mysql_bin_log对象。参考sql/binlog.cc中的init_server_components():
if (opt_bin_log) tc_log= &mysql_bin_log;

而在事务提交时,会依次执行:
tc_log->prepare();
tc_log->commit();
参考代码:sql/binlog.cc中的ha_commit_trans()。当mysql_bin_log是tc_log时,prepare和commit的代码在sql/binlog.cc中:

MYSQL_BIN_LOG::prepare();
MYSQL_BIN_LOG::commit();

-协调者日志Xid_log_event
作为协调者,Binlog需要将事务的XID记入日志,供恢复时使用。Xid_log_event有以下几个特点:
- 仅记录query_id
因为前缀部分不变,server_id已经记录在Event Header中,Xid_log_event中只记录query_id部分。
- 标志事务的结束

在Binlog中相当于一个事务的COMMIT语句。

一个事务在Binlog中看起来时这样的:
Query_log_event("BEGIN");DML产生的events; Xid_log_event;

- DDL没有BEGIN,也没有Xid_log_event 。
- 仅InnoDB的DML会产生Xid_log_event
因为MyISAM不支持2PC所以不能用Xid_log_event ,但会有COMMIT Event。
Query_log_event("BEGIN");DML产生的events;Query_log_event("COMMIT");

问题:Query_log_event("COMMIT")和Xid_log_event 有不同的影响吗?

- Xid_log_event 中的Xid可以帮助master实现CrashSafe。
- Slave的CrashSafe不依赖Xid_log_event
事务在Slave上重做时,会重新产生XID。所以Slave服务器的CrashSafe并不依赖于Xid_log_event 。Xid_log_event 和Query_log_event("COMMIT"),只是作为事务的结尾,告诉Slave Applier去提交这个事务。因此二者在Slave上的影响是一样的。

3 - 恢复(Recovery)
这个机制是如何保证MySQL的CrashSafe的呢,我们来分析一下。这里我们假设用户设置了以下参数来保证可靠性:

- 恢复前事务的状态
在恢复开始前事务有以下几种状态:
- InnoDB中已经提交
根据前面2PC的过程,可知Binlog中也一定记录了该事务的的Events。所以这种事务是一致的不需要处理。
- InnoDB中是prepared状态,Binlog中有该事务的Events。
需要通知InnoDB提交这些事务。
- InnoDB中是prepared状态,Binlog中没有该事务的Events。
因为Binlog还没记录,需要通知InnoDB回滚这些事务。
- Before InnoDB Prepare
事务可能还没执行完,因此InnoDB中的状态还没有prepare。根据2PC的过程,Binlog中也没有该事务的events。 需要通知InnoDB回滚这些事务。

- 恢复过程
从上面的事务状态可以看出:恢复时事务要提交还是回滚,是由Binlog来决定的。
- 事务的Xid_log_event 存在,就要提交。
- 事务的Xid_log_event 不存在,就要回滚。

恢复的过程非常简单:
- 从Binlog中读出所有的Xid_log_event
- 告诉InnoDB提交这些XID的事务
- InnoDB回滚其它的事务

4. SQL语句如何rollback

rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollback,建议你还是想别的办法吧,事务语句如下(sqlserver的给你借鉴):
--开启事务
begin tran
--执行操作
update Accounts_UsersExp set TelPhone=123456 where userid=14
--执行错误事务回滚
rollback
--如果正确进行事务提交
commit
可以勾选一句执行一句,但是commit了就不能rollback

5. JDBC连接mysql数据库有个rollback()函数吗这个函数怎么样求教

有。conn.rollback()。
但是如果 rollback 紧接着 close,是不用调用的,因为 close 会自动调用 rollback。

6. 什么是事务 COMMIT和ROLLBACK操作各做什么事情

访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起。

并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

commit是提交操作,将操作显式提交到数据库,这里需要注意,并不是所有sql语句执行完都需要进行commit操作,有些操作执行完就已经自动隐式提交到数据库了。

ROLLBACK回滚操作,在commit操作之前可以使用rollback 操作回滚到之前的状态。

执行完sql语句之后,处理的数据都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK后,放在回滚段中的数据就会被删除。

(6)数据库rollback扩展阅读:

COMMIT/ROLLBACK,都是用在执行 DML 语句之后的。所谓 DML 语句就是 INSERT / DELETE / UPDATE / SELECT ,而 CREATE TABLE / VIEW 之类的语句,是 DDL。

DML 语句,执行完之后,处理的数据,都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行COMMIT/ROLLBACK后,放在回滚段中的数据就会被删除。

所有的 DML 语句都是要显式提交了,所谓“显式提交”,就是要执行COMMIT/ROLLBACK。
而其他的诸如 DDL 语句的,都是隐式提交的。

就是说,不用进行COMMIT/ROLLBACK。在运行那些非 DML 语句后,ORACLE 已经进行了隐式提交,例如 CREATE TABLE,在运行脚本后,表已经建好了,并不在需要再进行显式提交

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

rollback 回滚的意思。 就是数据库里做修改后 ( update ,insert , delete)未commit 之前 使用rollback 可以恢复数据到修改之前。

8. oracle rollback是回滚整个数据库还是回滚某个用户的操作

Rollback是指一个用户在某一次事务提交之前的回滚,使得本次的操作无效。

SQL>InsertintoT_GHDWMLValues('G31003','哈尔滨自然公司','哈自然','郑毅','13936656561');

SQL>SavepointA;

SQL>UpdateT_GHDWMLsetlxr='陈宇'wheredwbm=’G31003’;

SQL>SavepointB;

SQL>DeleteFromT_GHDWMLwheredwbm=’G31003’;

SQL>Rollback;

SQL>Rollback;

SQL>Rollback;

9. 数据库的问题,事务定义中,COMMIT语句和ROLLBACK语句的作用是什么

Commit表示提交。Rollback的意思是回滚。

甲骨文公司(是一家全球数据库软件公司,总部位于美国加州红杉城。2008年,按收入计算,甲骨文公司是全球第三大软件公司,仅次于微软和IBM。

Oracle数据库产品被财富榜上的前1000家公司使用,也被许多大型网站使用。甲骨文公司于1989年进入中国,在北京、上海、广州和成都设有分支机构。

(9)数据库rollback扩展阅读:

数据库技术的应用及特点

数据库最初是用作大型公司或组织中大规模事务处理的基础。后来,随着个人电脑的普及,将数据库技术移植到pc中,实现单用户个人数据库应用。然后由于PC机在工作组内联网,数据库技术被移植到工作组级。

数据库现在在Internet和Intranet上广泛使用。在20世纪60年代中期,数据库技术被用来解决文件处理系统的问题。当时,数据库处理技术仍然非常脆弱,经常出现应用程序无法提交的情况。

20世纪70年代,关系模型的诞生为数据库专家提供了一种构建和处理数据库的标准方法,促进了关系数据库的发展和应用。

现在,数据库技术与Internet技术一起被用来在组织内联网、部门局域网、甚至WWW上发布数据库数据。

10. oracle数据库引起自动回滚的原因

比如说你的事务未提交进程意外终止(
掉线
啊,点击
叉叉
退出连接啊)未提交的数据全部
回滚
。或者在你的事务提交过程中,数据违反约束条件,事务内部出现错误被终止,则该事务中所有操作也被自动回滚。还有其他一些情况,这两个是主要的。