mysql - MySQL 保存点在 Web 服务中的实际应用?

标签 mysql web-services transactions nested-transactions

有没有人可以分享使用 MySQL 的经验 savepoints (直接或通过 ORM),尤其是在重要的 Web 服务中?你在哪里实际使用过它们?它们是否足够可靠(假设您愿意运行相当新版本的 MySQL)或是否过于前沿或过于昂贵?

最后,有没有人有过类似以下用例的经验,您是否为此使用了保存点?假设某些特定工作单元的要点是向 Orders 表添加一行(当然,不必与订单相关)并更新 OrdersAuditInfo 表,在同一个事务中。如果可能的话,更新 Orders 是必不可少的,但是 OrdersAuditInfo 表并不是那么重要(例如,只将错误记录到文件中是可以的,但继续进行与整体交易)。在低级别上它可能看起来像这样(警告,伪 SQL 如下):

BEGIN;

INSERT INTO Orders(...) VALUES (...);
/* Do stuff outside of SQL here; if there are problems, do a
 ROLLBACK and report an error (i.e., Order is invalid in this
 case anyway). */

SAVEPOINT InsertAudit;
INSERT INTO OrdersAudit(...) VALUES(...);
/* If the INSERT fails, log an error to a log file somewhere and do: */
ROLLBACK TO SAVEPOINT InsertAudit;

/* Always want to commit the INSERT INTO Orders: */
COMMIT;

但即使在这里,也许会有更好(或至少更常见)的成语?可以在完全不同的事务中执行 OrdersAuditInfo 插入操作,但最好保证 OrdersAuditInfo写入,除非最终 COMMIT 确实有效。

最佳答案

我通常倾向于避免保存点,因为它会使代码很难理解和验证。

在您发布的情况下,包裹在单个交易中将取决于 OrdersAudit 记录是否与 Orders 完全对应,是您业务规则的一部分。

编辑:只需重新阅读您的问题,您不需要保证 OrdersAuditOrders 之间的对应关系。所以我不会使用任何事务来插入 OrdersAudit 记录。

关于mysql - MySQL 保存点在 Web 服务中的实际应用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/591897/

相关文章:

php - 使用 implode 将值插入数据库表列

mysql - to_number() 的兼容性查询

java - 如何在 Glassfish 3 上跟踪 SOAP 消息

.net - 使用 ASP.net WEB API 进行交易

c# - 如何使用c#将数据添加到mysql中的指定列

php - 基于同一 while 循环内先前查询的数据进行查询

vb.net - 解决: Insufficient winsock resources available to complete socket connection initiation

asp.net - 检查Web服务是否存在

transactions - Contract.evaluateTransaction(fcn,args) 在查询背书节点期间是否会进行交易?

python - 服务器无法恢复事务。描述 :9800000002. (3971) (SQLEndTran)')