MySQL事务以及Rollback如何工作?

lov*_*ate 12 mysql rdbms transactions

我刚刚遇到交易,我想知道

  1. 使用它的利弊是什么,
  2. 回滚如何工作,旧的值保存在内存中,如果更大,会发生什么?

对于1.我知道你必须将它用于银行转账,但是将它用于一切都不是更好吗?!?

Bil*_*win 28

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

这个术语是原子的,即变化不能再细分.

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

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

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

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

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

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

  • 是的,这种情况很少见,但这已经影响了一些MySQL用户.因此,在MySQL 5.5中,回滚段增加到128个段.在MySQL 5.6中,他们意识到对大多数用户来说过度杀伤,因此他们将默认设置设置为1段,但您可以选择分配最多128个段.每个"细分"的大小各不相同,并根据需要增长,但不能超过1023笔交易的价值变化. (3认同)
  • CURRENT_TIMESTAMP 是 NOW() 的同义词。手册中说:“NOW() 返回一个常数时间,指示语句开始执行的时间。(在存储函数或触发器中,NOW() 返回函数或触发语句开始执行的时间。)这与 SYSDATE() 的行为不同,后者返回其执行的确切时间。” https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now (3认同)
  • 酷,回滚段。那是 RAM 还是磁盘/表中的空间? (2认同)
  • 回滚段位于磁盘上的表空间内。 (2认同)
  • 那么,如果我更改了这十亿行并且内容超出了回滚段的大小,事务会停止吗? (2认同)
  • 很好的答案。现在,如果这十亿条记录具有“updated_at”字段,那么它们在事务结束时都会获得相同的时间戳吗? (2认同)