2017-11-13 10 views
0

InnoDB를 사용하여 주식 테이블의 데이터 무결성을 유지하려면 어떻게해야합니까? 이를 위해서는 테이블 잠금과 트랜잭션을 모두 사용해야합니까? 좋은 예제를 찾으려고 노력했지만, 오픈 소스 전자 상거래 소프트웨어는 잘 알려진 테이블 잠금/트랜잭션을 구현하지 않습니다. 아래 코드가 작동합니까? 전체 테이블을 잠글 필요가 있습니까? 아니면 판매 된 제품의 행만 잠글 수있는 방법이 있습니까? 아니면 누구도 좋은 모범을 보았습니까?재고 테이블에 대한 테이블 및/또는 거래를 잠그시겠습니까?

CREATE TABLE `stock` (
    `product_id` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_unicode_ci', 
    `quantity` INT(10) UNSIGNED NOT NULL DEFAULT '0', 
    PRIMARY KEY (`product_id`) 
) 
COLLATE='utf8mb4_unicode_ci' 
ENGINE=InnoDB; 

. 모든 UPDATE 쿼리가 1 행에 영향이있는 경우

LOCK TABLES stock WRITE; 
START TRANSACTION; 
SET autocommit = 0; 
UPDATE stock SET quantity = quantity - 4 WHERE product_id = 'PRODUCT_1' AND quantity >= 4; 
UPDATE stock SET quantity = quantity - 2 WHERE product_id = 'PRODUCT_2' AND quantity >= 2; 
UPDATE stock SET quantity = quantity - 5 WHERE product_id = 'PRODUCT_3' AND quantity >= 5; 
COMMIT or ROLLBACK; 

그렇지 않으면 당신이 동일한 코드를하지 실행해야합니다 동시 클라이언트를 만들고 싶어하지 않는 한 테이블 잠금을 할 필요는 없습니다

답변

0

롤백 COMMIT 동시 업데이트를 실행합니다. 각 업데이트가 별개의 행 하위 집합에서 작동하기 때문에 중요하지 않습니다.

어쨌든 트랜잭션을 시작한 후에 autocommit = 0을 설정할 필요는 없습니다. 트랜잭션을 암시 적으로 시작한다는 것은 COMMIT (또는 일부 명령문이 암시 적 확약을 야기 할 때까지)을 사용할 때까지 확약하지 않는다는 것을 의미합니다.

각 업데이트가 하나 이상의 행을 변경하는지 확인하려는 경우를 제외하고 세 가지 업데이트를 하나의 업데이트로 모두 래핑 할 수도 있습니다.

0

"1 영향을받은 행"은 테스트 대상이 아닙니다. 실패, 교착 상태, 제한 시간 등이 테스트됩니다. 정확히 1 행이 아닌 경우 실패하려면 rows_affected를 가져와 "1"로 테스트 한 다음 ROLLBACK을 테스트해야합니다. "... 그 다음 다른 ROLLBACK COMMIT 경우"또한

COMMIT or ROLLBACK 

필요가되게합니다. 이것은 응용 프로그램 언어로하는 것이 가장 좋습니다.