如果在长时间操作期间连接丢失会发生什么?
例如,有一个select语句需要几分钟才能完成,并且在执行期间连接会丢失。它会继续执行还是会停止?
对于删除语句:当客户端断开连接时,它是执行完成还是中断?数据将会发生什么:它会在多长时间内提交或回滚?
对于ddl操作:我有一个长时间运行的alter table tbl_name move
操作,当客户端失去连接时会发生什么?会继续执行还是会被打断?
答案 0 :(得分:5)
我假设我们正在讨论类似于客户端应用程序崩溃或网络连接被丢弃的事情,而不是应用程序正在执行干净断开连接的情况,因为在事务处于打开状态时无法执行干净的断开连接更不用说声明正在运行。
通常,语句将在服务器上运行完成(其中SELECT
的“完成”是它可以返回客户端请求的第一组行的点,这可能需要执行也可能不需要执行整个声明)。然后,服务器将尝试将结果准备好的事实传达给客户端。当它没有得到响应时(可能需要几分钟才能等待ACK
数据包),它知道客户端进程已经死了并开始回滚未提交的事务(释放事务持有的所有锁)。如果您作为事务的一部分对数据库进行了更改(即,您已完成插入,更新和/或删除),则可能需要花费相同的时间来回滚更改,因为它首先生成更改。
答案 1 :(得分:1)
对于像select
和delete
这样的简单DML语句,事务将被回滚或提交。
“何时”会发生这种情况?实际上并不重要。其他客户只看到已提交事务的结果,因此时间无关紧要。
对于DDL语句,根据the official docs,“在数据库执行DDL语句之前发生隐式COMMIT,之后立即发生COMMIT或ROLLBACK”。
在事务中,如果您要执行一些DML语句,然后执行DDL语句,则可以提交DML语句,但DDL语句会回滚 - 即使它们都在同一事务中。
对于你给出的简单例子,它是全有或全无。 ......一般而言,如果在收到已确认的已确认交易之前丢失了连接,则无论是否有效,您都不会。你必须验证。
[编辑:只是稍微详细说明“你必须验证” ...你必须验证你是否已经向数据库发送了“提交”(显式或隐式地),在您知道数据库是否执行提交之前,您将丢失连接 如果在发出提交之前丢失了连接,可以保证它将被回滚(上面有DDL警告)]
答案 2 :(得分:0)
所有数据库操作都根据ACID
属性工作。
Atomicity
对数据的所有更改都执行,就像它们是单个操作一样。也就是说,执行所有更改,或者都不执行任何更改 这意味着根据Atomicity,更改将被回滚。