SQL 本身中的“提交”语句是事务吗?

Posted

技术标签:

【中文标题】SQL 本身中的“提交”语句是事务吗?【英文标题】:Is "commit" statement in SQL itself a transaction? 【发布时间】:2018-09-15 15:42:45 【问题描述】:

在 SQL 中,每条语句都是一个事务。

如果commit语句发生在事务块中,并且成功执行,那么如果执行后系统立即崩溃,是否仍有可能丢失数据库状态?

【问题讨论】:

【参考方案1】:

不,在 SQL 中每条语句都不是事务。事务包含一组语句,这些语句全部作为一个组执行,或者根本不执行,以保持数据一致性。

一旦提交事务,系统崩溃不会撤消更改,除非出现不可恢复的灾难性错误(最不可能)。

一些数据库提供额外的 SQL 语句来支持基本的 SQL 语句(如 DDL、DML 等)以用于额外目的。例如:

begin transaction;
savepoint;
commit;
rollback;

这取决于每个数据库,这些不是事务。只是采用 SQL 语句形式的额外命令(如果您的数据库定义了它们)。前面提到的实际上是“事务分隔符”,它们不构成事务的一部分。

【讨论】:

我猜这也取决于 具体 RDBMS - 但在 SQL Server 中,如果你指定你自己的(显式)事务,那么任何语句(包括SELECTUPDATEINSERTDELETE)实际上都在它们自己的(隐式)事务中执行 - 所以在 SQL Server 中你可以每个语句都在其自己的(隐式)事务中(除非您定义自己的显式事务) 我不是 SQL Server 专家,但在我看来,当没有设置事务分隔符时,它会在自动提交模式下工作。某些客户端可能会默认打开或关闭自动提交(这取决于客户端)。这意味着每个 SQL 语句都隐式包含在“事务开始”和“提交”中。即使看起来像一个,这也不会使每个 SQL 语句都成为一个事务——那里有一个重要的区别。【参考方案2】:

提交/回滚表示事务的结束。执行后,数据会反映在所有其他会话中,如果它是提交的话。 如果您觉得提交本身是一个事务,那么您将需要其他东西来完成该事务,例如回滚或另一个提交。这将是一个无限循环。

事务就像一个旅程,提交/回滚是你的目的地,不是一个很好的例子,但可能有助于理解。

【讨论】:

但是当系统在执行 COMMIT 时崩溃时会发生什么。这意味着,系统正在执行巨大的提交,突然它崩溃了。会发生什么? 好吧,如果您在提交过程中发生了数据库服务器中断,那么所有其他人也将消失。当您尝试重新启动它时,您的 redo logsarchived redo logs 就会出现。这些是执行提交或回滚时引用的日志。它们与您的实例相关联并跟踪您的更改。当您的服务器崩溃并且正在尝试恢复选项时,它们也会被引用。归档重做日志是重做日志的离线存储。【参考方案3】:

如果执行后系统立即崩溃

我相信不,因为COMMIT 已经执行,但是是的,而COMMIT 仍在进行中。但是这样的系统故障可能会导致状态不一致

【讨论】:

那么,如果COMMIT仍在进行中并且系统崩溃了,那么数据库将如何处于不一致的状态,因为实际的事务还没有完成。这意味着,数据库将回滚到之前的稳定状态。我说的对吗? @AdityaNarkar,不,因为底层服务器已经死了,回滚操作永远不会发生 由于提交从未发生,数据库从未改变其状态。

以上是关于SQL 本身中的“提交”语句是事务吗?的主要内容,如果未能解决你的问题,请参考以下文章

对mysql事务提交回滚的错误理解

sql server中的事务是啥意思

ROLLBACK语句只能针对未提交的事务进行回滚操作,已提交的事务是不能回滚的?

jdbc 5.0

SQL记录-PLSQL事务

(十五)PL/SQL事务