使用数据库事务时,会导致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可能会失败.您可能拥有足够的资源来记录您希望进行的所有更改,但缺乏实际实施更改的资源.
而这并没有考虑其可能失败的其他原因:
更改本身可能不适合数据库的约束.
功率损失使事情无法完成.
请求的选择并发级别可能会禁止更新(例如,游标更新已修改的表).
提交可能会超时或处于由于饥饿问题而超时的连接上.
客户端和数据库之间的网络连接可能会丢失.
而所有其他"简单"的原因并不是我的头脑.
某些数据库引擎可能会将UNIQUE索引约束检查推迟到COMMIT.显然,如果约束在提交时不成立,那么它将失败.
如果您使用两阶段提交,则不行。所有可能出错的事情都在准备阶段完成。
在提交期间仍然可能出现网络中断、断电、宇宙射线等情况,但即便如此,事务仍将被写入永久存储,并且如果触发了提交,恢复过程应该将它们执行完毕。
希望。