MySQL事务以及Rollback如何工作?

时间:2014-01-11 01:15:27

标签: mysql transactions rdbms

我遇到了交易,我想知道

  1. 使用它的利弊是什么,
  2. 回滚是如何工作的,是旧的值保存在内存中,如果更大,会发生什么?
  3. 对于1.我知道你必须将它用于银行转账,但是将它用于所有事情会不会更好?!

1 个答案:

答案 0 :(得分:23)

事务的好处是执行复杂的更改,这可能需要对不同的表进行多次更新,并确保它们都会成功或者全部回滚。

这个术语是 atomic ,即更改不能再细分。

事实上,无论您是否请求,MySQL的默认存储引擎InnoDB都会使用事务处理。但大多数人使用名为 autocommit 的模式,其中每个语句隐式启动一个事务,并在语句结束后隐式提交。在自动提交模式下,您没有机会选择回滚。声明成功,否则如果遇到错误,它会自动回滚。

如果启动显式事务,执行一些更新,然后回滚,InnoDB将恢复原始数据状态。它通过将原始数据存储在名为 rollback segment 的数据库区域中来保留原始数据。因此,如果您回滚,它只会重新复制这些数据页以替换您更改的数据页。

这可能需要一些时间,因此如果您尝试查询已更改但已回滚的数据,InnoDB会自动绕道以从回滚段中读取原始数据,直到将其重新合并到回滚段中为止。表。

例如,假设您启动了一个事务,并更新了十亿行。这会将许多页面的原始行复制到回滚段,然后使用更改的数据填充表 - 但更改的数据是未提交。没有人应该能够读取未提交的数据,因此查询该表的任何人都将自动从回滚段获取原始数据。

然后您回滚您的交易。在接下来的几分钟内,InnoDB逐渐清理,最终全部恢复同步。但是,任何人都可以在此期间继续查询原始数据。

如果你已经提交了你的交易,那么MySQL只会将所有已更改的数据标记为已提交,随后读取数据的任何人都不会遇到从回滚段读取的轻微开销。