结束事务的其他情景
除了提交 commit 或 rollback 指令,结束事务还可以由其他情景触发,要么作为活动的间接结果,要么作为意外的结果:
- 服务器宕机,在这种情况下,服务器重启时事务将会被自动回滚;
- 提交一个 SQL 模式语句,比如 alter table,这将会引起当前事务提交和一个新事务启动;
- 提交一个 start transaction 命令,将会引起前一个事务提交;
- 因为服务器检测到一个死锁并且确定当前事务就是罪魁祸首,那么服务器就会提前结束当前的事务。这种情况下,事务将会被回滚,同时释放错误消息。
注意:“服务器宕机”有两种情况。假设现在有两个 update 语句在同一个逻辑工作单元,那么
- 如果程序设法完成两个 update 语句后,还没有执行 commit 或 rollback 命令,服务器突然宕机了,那么事务会在服务器重新上线后被回滚。(数据库服务器上线前必须完成的任务之一就是查找宕机前正在运行但未完成的事务,并将其回滚。)
- 如果程序完成了事务,并发出了 commit 指令,还没有将变化持久化到永久存储区(也就是说,修改的数据还位于内存,但没有被刷新到磁盘),服务器就宕机了,那么服务器重启时数据库服务器必须重新应用事务的变化(这种属性称为持久性)。