6

누구나 MySQL savepoints (직접 또는 ORM을 통해)을 사용하여 공유 할 수있는 경험이 있습니까? 특히 사소한 웹 서비스에서 특히 그렇습니까? 실제로 어디에서 사용 했습니까? 그것들은 충분히 안정적입니까 (여러분이 MySQL의 최신 버전을 기꺼이 사용하고 있다고 가정 할 때) 또는 너무 날카롭거나 비싸지 않습니까?웹 서비스에서 MySQL 세이브 포인트를 실제로 사용합니까?

마지막으로, 다음 유스 케이스와 같은 경험이있는 사람이 누구이며 저장 점을 사용 했습니까? 특정 작업 단위의 주된 포인트는 Orders 테이블에 행을 추가하는 것입니다 (물론 주문 관련 일 필요는 없습니다). 같은 트랜잭션으로 OrdersAuditInfo 테이블을 업데이트한다고 가정 해보십시오. 가능하면 Orders을 업데이트해야하지만 OrdersAuditInfo 테이블은 필수적이지 않습니다 (예 : 파일에 오류를 기록하고 전체 트랜잭션을 계속 진행하는 것이 좋습니다).

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; 

을하지만 여기에도 아마 더 나은 (또는 적어도 일반적인) 관용구가있을 것 : 낮은 수준에서 그것과 같을 수 있습니다 (경고, 의사-SQL은 다음)? 완전히 다른 거래에서 OrdersAuditInfo 삽입을 할 수는 있지만 COMMIT이 실제로 작동하지 않는 한 이 아니고이 아닌 테이블에 쓰여졌 음을 보장하는 것이 좋습니다.

답변

1

일반적으로 코드를 이해하고 확인하기가 어려울 수 있으므로 SAVEPOINT는 피하는 경향이 있습니다.

게시 한 경우 OrdersAudit 레코드가 정확히 Orders에 해당하는지 여부에 따라 단일 트랜잭션으로 래핑되는 것이 비즈니스 규칙의 일부입니다.

수정 : 질문을 다시 읽고 OrdersAuditOrders 사이의 보증 된 통신에 대한 요구 사항이 없습니다. 그래서 나는 OrdersAudit 레코드를 삽입하기 위해 어떤 트랜잭션도 사용하지 않을 것입니다.

+0

전체 트랜잭션의 일부로 OrdersAudit을 원했던 이유는 Orders에 대한 삽입이 어떤 이유로 COMMIT 시간에 실패한 경우였습니다. –

관련 문제