我刚刚接触到事务管理,想知道:
- 使用它的优缺点是什么?
- 回滚是如何工作的?旧值是否保存在内存中?如果比较大会发生什么?
对于问题1,我知道在银行转账时必须使用它,但是使用它处理所有事情是否更好呢?
我刚刚接触到事务管理,想知道:
对于问题1,我知道在银行转账时必须使用它,但是使用它处理所有事情是否更好呢?
事务的好处在于执行复杂的更改,这可能需要对不同表进行多次更新,并确保它们全部成功或者全部回滚。
这个术语叫做原子性,也就是说,更改不能再被分割成更小的部分。
事实上,MySQL的默认存储引擎InnoDB无论您是否请求,都会对所有事情使用事务。但是大多数人使用一种称为自动提交的模式,在该模式下,每个语句隐式地开始一个事务,并在语句完成后隐式提交。在自动提交模式下,您没有机会选择回滚。要么语句成功,否则如果遇到错误,它会自动回滚。
如果您启动一个显式事务,执行一些更新,然后回滚,InnoDB将恢复数据的原始状态。它通过将其存储在数据库的一个区域中,称为回滚段,来保留原始数据。因此,如果您回滚,它只是重新复制那些数据页面,以替换您更改的页面。
这可能需要一些时间,因此,如果尝试查询已更改但已回滚的数据,则InnoDB会自动绕过并从回滚段中读取原始数据,直到将其合并回表中。
例如,假设您启动一个事务并更新了十亿行。这将复制许多页的原始行到回滚段,然后填充表格以更改数据 - 但更改的数据是未提交的。不能读取未提交的数据,因此查询表的任何人都会自动从回滚段中获取原始数据。
然后回滚您的事务。在接下来的几分钟内,InnoDB逐渐清理,并最终恢复同步。但是,在此期间,任何人都可以继续查询原始数据。
如果您已经提交了事务,则MySQL只会标记所有更改的数据为已提交,随后读取数据的任何人都不会体验从回滚段中读取的轻微开销。