事务的提交和回滚是一个老生常谈的技术了,但是突然今天一下子想到一个问题把自己搞蒙了。首先,事务如果不提交,磁盘上的数据是不会变的。既然是这样,回滚究竟做了什么,它回滚了什么呢?如果仅仅只是解除对表或行的锁定,为什么undo日志里面还要记录数据的原始内容,既然没有改,还需要恢复吗?
参考GPT和自己的思路:回滚操作在数据库中是非常重要的,因为它确保了在事务执行失败或者被撤销时,数据库会回到事务开始前的状态。
在事务提交之前,数据库所做的所有更改都只是暂时性的,这些更改只存在于内存中,直到事务被提交后才会被写入磁盘。如果事务失败或者被撤销,这些更改就需要被撤销掉,以便保持数据库的一致性。
回滚操作的实现方法是通过回滚日志(undo log)来记录之前的操作,undo日志包含了在事务执行过程中所做的所有更改的反向操作,可以将数据库恢复到事务开始之前的状态。因此,回滚日志需要记录每一个更改的原始内容,以便恢复数据到之前的状态。
回滚操作不仅需要解除对表或行的锁定,还需要确保更改的数据被正确地恢复到之前的状态。因此,在undo日志中记录原始内容是必要的。
总之,回滚操作不仅是解除锁定的简单操作,还包括将数据恢复到事务开始前的状态。因此,undo日志需要记录每个更改的原始内容以便恢复数据。
以下是在GitHub上创建一个新仓库的步骤:
1 打开GitHub网站并登录您的账户。
2 点击页面右上角的“+”图标,然后从下拉菜单中选择“New repository”。
3 输入仓库名称和描述。
4 根据需要选择仓库的可见性:公共或私有。
5 选择一个许可证(License),或者在以后添加。
6 根据需要选择“Initialize this repository with a README”选项,以便在创建仓库时自动添加README文件。
7 点击“Create repository”按钮,创建新仓库。
8 现在您已经创建了一个新的GitHub仓库,您可以使用它来存储您的代码、文档和其他项目相关的文件。
事务回滚是一种撤销对数据库已提交的修改操作的技术。在发生错误或其他意外情况下,事务回滚可以恢复到原始状态,保证数据的完整性和一致性。
在事务回滚时,不仅需要解除对表或行的锁定,还需要撤消对数据库的修改操作。因此,undo日志记录了数据的原始内容,以便在需要回滚时能够恢复到原始状态。这些undo日志记录被用于撤消对数据的修改操作,与数据库文件的操作是相反的。因此,undo日志是事务回滚的重要组成部分。
总之,事务回滚是一种强大的技术,可以允许数据库管理员修复任何错误,以保证数据的完整性和一致性。
关于事务回滚的问题,我觉得你纠结的原因是,你觉得如果事务不提交,数据就不会写磁盘,所以你觉得回滚没啥用处。那你反向思考下,既然回滚设计出来,那就有存在的必要,那你前面的说法就不成立,因为没有提交事务并不代表你对数据库的改变不存在,有些更新过的数据由后台写数据进程DBWn被写入数据文件中,但加上未提交标志,等事务被提交时,再把未提交标志改为已提交标志。
其实,写入不写入磁盘和提交没提交没有关系,就算你提交了也不一定会写磁盘,写磁盘是有一个叫dwr的进程来执行的。
这个要解释起来,可以讲得很深,mysql的事务和日志的知识、流程可以去详细看看官方的连接。
你是不是忘记了数据库还有个脏数据的概念?
而且如果出错了不显式的执行回滚操作,你过后还能在日志里找到什么时候出的错吗
参考GPT和自己的思路,在 SQL 中,事务可以被认为是一组数据库操作,这些操作必须全部成功或全部失败。如果事务被回滚,那么这组操作所做的更改将被撤销并恢复到事务开始之前的状态。在这个过程中,回滚实际上是撤销了之前已经完成的操作,将数据库恢复到之前的状态。
具体地说,当一个事务回滚时,SQL 会执行以下步骤:
1.撤销已经提交的事务所做的更改:如果某个事务已经被提交了,但是后来又被回滚了,那么 SQL 会撤销这个事务所做的所有更改,恢复到事务开始之前的状态。
2.恢复未提交的事务:如果某个事务还没有提交,但是已经做了一些更改,那么 SQL 会撤销这些更改,恢复到事务开始之前的状态。
3.释放被锁定的资源:当一个事务被回滚时,SQL 会释放该事务所占用的所有资源,包括锁定的表和行。
总之,回滚操作是将数据库恢复到之前的状态,使得之前已经做的更改被撤销。这个过程可以确保数据库的一致性和可靠性,并避免数据不一致的情况发生。
大家可能没有明白我的问题,再说一次。
1、如果事务没有提交,物理磁盘上的数据改变没有?
2、如果改变了,那提交的意义是什么?
3、如果没有改变,那回滚又是做什么?为什么undo中还要记录事务发生前数据的版本?
如果各位大佬能够按题目回答疑惑,不胜感激