COMMIT语句(在SQL中)是否会失败?怎么样?

Rus*_*uss 25 sql transactions

使用数据库事务时,会导致COMMIT事务中的最终语句失败的可能条件(如果有的话)是什么,假设事务中的所有语句都已经执行而没有问题?


例如......假设您有一些两阶段或三阶段提交协议,其中您执行一堆语句,然后等待一些主进程告诉您何时可以最终提交事务:

-- <initial handshaking stuff>
START TRANSACTION;
-- <Execute a bunch of SQL statements>
-- <Inform master of readiness to commit>
-- <Time passes... background transactions happening while we wait>
-- <Receive approval to commit from master (finally!)>
COMMIT;
Run Code Online (Sandbox Code Playgroud)

如果您的代码到达最终的COMMIT语句并将其发送到您的DBMS,您是否会在该语句中收到错误(唯一性问题,数据库已满等)?什么错误?为什么?它们是如何出现的?它会根据您运行的DBMS而有所不同吗?

Edw*_*uck 16

COMMIT可能会失败.您可能拥有足够的资源来记录您希望进行的所有更改,但缺乏实际实施更改的资源.

而这并没有考虑其可能失败的其他原因:

  1. 更改本身可能不适合数据库的约束.

  2. 功率损失使事情无法完成.

  3. 请求的选择并发级别可能会禁止更新(例如,游标更新已修改的表).

  4. 提交可能会超时或处于由于饥饿问题而超时的连接上.

  5. 客户端和数据库之间的网络连接可能会丢失.

而所有其他"简单"的原因并不是我的头脑.


Ign*_*ams 9

某些数据库引擎可能会将UNIQUE索引约束检查推迟到COMMIT.显然,如果约束在提交时不成立,那么它将失败.

  • 这是PostgreSQL 9.0的一个新功能.http://wiki.postgresql.org/wiki/What%27s_new_in_PostgreSQL_9.0#DEFERRABLE_UNIQUE_CONSTRAINTS (3认同)
  • Oracle可以推迟FK约束检查,http://infolab.stanford.edu/~ullman/fcdb/oracle/or-triggers.html (2认同)
  • @ IgnacioVazquez-Abrams如果*确实*失败,交易的状态是什么?我们是否必须在此时发布回滚,或者我们是否已经退出交易? (2认同)

Tho*_*ler 5

当然.

在多用户环境中,COMMIT可能由于其他用户的更改而失败(例如,当应用于当前数据库时,COMMIT会违反参照约束...).

托马斯


Tom*_*son 5

如果您使用两阶段提交,则不行。所有可能出错的事情都在准备阶段完成。

在提交期间仍然可能出现网络中断、断电、宇宙射线等情况,但即便如此,事务仍将被写入永久存储,并且如果触发了提交,恢复过程应该将它们执行完毕。

希望。