4

如果长时间运行时连接丢失会怎样?

例如,有一个 select 语句需要几分钟才能完成,并且在执行过程中连接丢失。它会继续执行还是停止?

对于删除语句:当客户端断开连接时,它会执行完成还是中断?数据会发生什么:它会被提交还是回滚,多快?

对于 ddl 操作:我有一个长时间运行的alter table tbl_name move操作,当客户端失去连接时会发生什么?会继续执行还是会被中断?

4

3 回答 3

5

我假设我们正在谈论类似于客户端应用程序崩溃或网络连接断开的情况,而不是应用程序进行完全断开连接的情况,因为您无法在事务打开时进行完全断开连接,更不用说在一条语句正在运行。

通常,该语句将在服务器上运行完成(其中 a 的“完成”SELECT是它可以返回客户端请求的第一组行的点,这可能需要也可能不需要完整地执行该语句)。然后,服务器将尝试将结果准备就绪的事实传达回客户端。当它没有得到响应时(可能需要几分钟才能等待ACK数据包),它知道客户端进程已死并开始回滚未提交事务的过程(这会释放事务持有的所有锁)。如果您在事务中对数据库进行了更改(即您已经完成了插入、更新和/或删除),那么回滚更改所需的时间可能与最初生成更改所需的时间一样长。

于 2012-10-12T20:29:51.633 回答
1

select对于像and这样的简单 DML 语句delete,事务将被回滚或提交。

“什么时候”会出现这种情况? 其实没关系。其他客户端只看到已提交事务的结果,因此时间无关紧要。

对于 DDL 语句,根据官方文档,“在数据库执行 DDL 语句之前立即发生隐式 COMMIT,之后立即发生 COMMIT 或 ROLLBACK”。

在事务中,如果您要执行一些 DML 语句,然后执行 DDL 语句,则 DML 语句可能会被提交,但 DDL 语句会回滚——即使它们都在同一个事务中。

但是,对于您提供的简单示例,全有或全无。...而且一般来说,如果您在收到已提交交易的确认之前失去了连接 - 无论它是否有效,您都不会知道。你必须验证。

[编辑:只是稍微详细说明“你必须验证” ......你必须验证你是否已经向数据库发送了一个“提交”(显式或隐式),并且在你知道数据库是否执行之前你失去了连接提交。
如果您在发出提交之前断开连接,则可以保证它将被回滚(上面的 DDL 警告)]

于 2012-10-12T19:27:47.243 回答
0

所有数据库操作都是根据ACID属性进行的。

Atomicity

对数据的所有更改都像单个操作一样执行。也就是说,所有更改都已执行,或者没有一个。
这意味着根据原子性,更改会被回滚。

于 2012-10-12T18:51:34.193 回答