카테고리 없음
Maxscale Causal Reads 기능 테스트
자바바라
2024. 11. 12. 23:13
Causal Reads 기능을 테스트하기 위한 시나리오에 맞는 더미 데이터를 생성하는 SQL 스크립트를 제공해드리겠습니다. 이 스크립트는 MySQL/MariaDB에서 실행할 수 있습니다.
-- 테이블 생성
CREATE TABLE customers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
customer_id INT,
total_amount DECIMAL(10, 2),
status VARCHAR(20),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
CREATE TABLE order_items (
id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT,
product_name VARCHAR(100),
quantity INT,
price DECIMAL(10, 2),
FOREIGN KEY (order_id) REFERENCES orders(id)
);
-- 더미 데이터 생성
-- 고객 데이터 생성 (1000명)
INSERT INTO customers (name, email)
SELECT
CONCAT('Customer ', FLOOR(RAND() * 1000)),
CONCAT('customer', FLOOR(RAND() * 1000), '@example.com')
FROM
information_schema.columns
LIMIT 1000;
-- 주문 데이터 생성 (5000건)
INSERT INTO orders (customer_id, total_amount, status)
SELECT
FLOOR(1 + RAND() * 1000),
ROUND(RAND() * 1000, 2),
ELT(FLOOR(1 + RAND() * 4), 'Pending', 'Processing', 'Shipped', 'Delivered')
FROM
information_schema.columns
LIMIT 5000;
-- 주문 아이템 데이터 생성 (각 주문당 1-5개 아이템)
INSERT INTO order_items (order_id, product_name, quantity, price)
SELECT
o.id,
CONCAT('Product ', CHAR(65 + FLOOR(RAND() * 26))),
FLOOR(1 + RAND() * 5),
ROUND(10 + RAND() * 90, 2)
FROM
orders o
CROSS JOIN (SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) numbers
WHERE
RAND() < 0.7;
-- 테스트를 위한 프로시저 생성
-- 1. 주문 생성 후 즉시 주문 상태 조회
DELIMITER //
CREATE PROCEDURE create_and_check_order(IN p_customer_id INT)
BEGIN
DECLARE new_order_id INT;
START TRANSACTION;
-- 새 주문 생성
INSERT INTO orders (customer_id, total_amount, status)
VALUES (p_customer_id, ROUND(RAND() * 1000, 2), 'Pending');
SET new_order_id = LAST_INSERT_ID();
-- 주문 아이템 추가
INSERT INTO order_items (order_id, product_name, quantity, price)
VALUES (new_order_id, CONCAT('Product ', CHAR(65 + FLOOR(RAND() * 26))), FLOOR(1 + RAND() * 5), ROUND(10 + RAND() * 90, 2));
COMMIT;
-- 주문 상태 즉시 조회
SELECT * FROM orders WHERE id = new_order_id;
END //
DELIMITER ;
-- 2. 고객 정보 업데이트 후 바로 조회
DELIMITER //
CREATE PROCEDURE update_and_check_customer(IN p_customer_id INT)
BEGIN
START TRANSACTION;
-- 고객 정보 업데이트
UPDATE customers
SET name = CONCAT('Updated Customer ', p_customer_id),
email = CONCAT('updated', p_customer_id, '@example.com')
WHERE id = p_customer_id;
COMMIT;
-- 고객 정보 즉시 조회
SELECT * FROM customers WHERE id = p_customer_id;
END //
DELIMITER ;
-- 3. 주문 상태 변경 후 관련 통계 조회
DELIMITER //
CREATE PROCEDURE update_order_and_check_stats(IN p_order_id INT, IN p_new_status VARCHAR(20))
BEGIN
START TRANSACTION;
-- 주문 상태 변경
UPDATE orders
SET status = p_new_status
WHERE id = p_order_id;
COMMIT;
-- 관련 통계 조회
SELECT
status,
COUNT(*) as order_count,
AVG(total_amount) as avg_amount
FROM
orders
GROUP BY
status;
END //
DELIMITER ;
이 스크립트는 다음과 같은 작업을 수행합니다:
필요한 테이블들을 생성합니다.
각 테이블에 더미 데이터를 삽입합니다.
Causal Reads 테스트를 위한 세 가지 프로시저를 생성합니다:
create_and_check_order: 새 주문을 생성하고 즉시 조회합니다.
update_and_check_customer: 고객 정보를 업데이트하고 즉시 조회합니다.
update_order_and_check_stats: 주문 상태를 변경하고 관련 통계를 조회합니다.
이 프로시저들을 사용하여 Causal Reads 기능을 테스트할 수 있습니다. 예를 들어:
sql
CALL create_and_check_order(1);
CALL update_and_check_customer(1);
CALL update_order_and_check_stats(1, 'Shipped');
이러한 호출을 통해 데이터 일관성과 Causal Reads의 효과를 확인할 수 있습니다.