SQL 事务:我什么时候回滚?

Man*_*ngo 6 transaction rollback

这可能是一个简单的问题,但我想检查回滚事务的机制。

据我了解,步骤如下:

  1. BEGIN TRANSACTION (或同等学历)
  2. 一个或多个 SQL 语句
  3. COMMIT 或者 ROLLBACK

据我所知,如果其中一个 SQL 语句失败,例如无效INSERTUPDATE.

这表明上述过程,直到提交可以在手动输入的语句集合中。

但是,我在哪个阶段做出回滚的决定?这是否表明ROLLBACK在程序中会发生更多的事情?换句话说,有人会手动回滚吗?

通过过程,我不一定指的是存储过程。我想某些应用程序可能会做同样的事情。

我认为这个问题一般适用于任何 SQL 数据库(当然,前提是它支持事务)。

Sha*_*nky 2

换句话说,是否曾经手动回滚?

不,不是这样,除非有人正在进行测试,否则我几乎没有看到人们手动进行回滚。回滚是在存储过程或事务中指定的,您希望在其中输入完整的更改或根本不输入任何更改。

据我所知,如果其中一条SQL语句失败,例如无效的INSERT或UPDATE,事务将自动回滚。

根据事务的启动方式,如果事务处于显式开始事务并提交是的状态,它将在查询失败后完全回滚到其初始状态,而如果事务不在开始事务并提交状态下,它将存储完成的更改直到查询失败,并且从查询失败后,它将停止进行进一步的更改。

系统启动回滚的一个典型情况是当死锁发生时,SQL Server通过内部机制选择死锁受害者,终止事务,并且它可能会也可能不会回滚,具体取决于它是显式事务还是隐式事务。就像当正常的 select 语句被杀死时一样,它们本身也没有回滚