6

有没有人有使用MySQL savepoints(直接或通过ORM)共享的经验,尤其是在非平凡的Web服务中?你真的在哪里使用它们?它们足够可靠吗(假设你愿意运行一个相当新的MySQL版本),还是太过流血或昂贵?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插入,但是如果除非最后的COMMIT实际工作,否则可以保证OrdersAuditInfo表格不是而是

回答

1

我通常倾向于避免SAVEPOINT,因为它可能使代码很难理解和验证。

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

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

+0

我之所以要OrdersAudit成为整体交易的一部分,是因为某些原因在订单中插入订单失败。 – 2009-03-03 07:05:10

相关问题