我想我的原则是对的,我只是想确保我的原则是对的。
因此,当autocommit被启用时,意味着我执行的每个命令都不会被直接执行,除非谁触发了提交。例如,当我有一个基本宏,运行方式如下:
statement.executeUpdate("SET autocommit = 0;")
//some code
//SQL Queries
//SQL DELETEs
//SQL INSERTs
statement.executeUpdate("COMMIT;")
然后会发生的事情是-如果脚本毫无问题地运行,那么脚本会执行到每个sql语句并在最后提交,如果没有,并且发生了错误或异常,则脚本在该点处中断永远不会转到将要进行提交的点,并且在该点之前的每个更改都是“撤消”,因此每个删除的信息仍然存在,并且每个插入都会被丢弃。
是这么简单还是我做错了什么?
1条答案
按热度按时间jv4diomz1#
假设您使用的是一个像样的数据库,那么当前事务的数据通常不存储在表堆本身中,而是存储在“重做日志”中。
也就是说,在执行提交之前,它甚至不在表中。提交和其他稍后处理的操作会在某个时候将它们放在主表中。
一般来说,如果数据库引擎崩溃,数据可能仍然在磁盘上的某个地方,但不在任何“正式”表区域中,因此当数据库引擎重新启动时,它将被丢弃。它没有修改实际数据。