Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi
    solution
    Đăng nhập
    Đăng nhập

    Đề bài: [SQL 10.3] SAVEPOINT: hoàn nguyên một phần transaction

    📖Cần ôn lý thuyết? Đọc bài giảng Buổi 10: Index & Transaction + Review toàn bộ khóa — khóa SQL

    Tạo stored procedure sp_PayoutTwo với 5 tham số: from_acc (INT), to1 (INT), amt1 (DECIMAL(18,2)), to2 (INT), amt2 (DECIMAL(18,2)). Procedure thực hiện hai khoản chi liên tiếp từ cùng một tài khoản nguồn trong một transaction, giả định các tài khoản đều tồn tại và hợp lệ:

    1. Bước 1: trừ amt1 khỏi from_acc, cộng amt1 vào to1. Nếu sau bước 1 số dư from_acc < 0 → ROLLBACK toàn bộ rồi thoát.
    2. Đặt SAVEPOINT ngay sau bước 1.
    3. Bước 2: trừ amt2 khỏi from_acc, cộng amt2 vào to2. Nếu sau bước 2 số dư from_acc < 0 → chỉ hoàn nguyên về SAVEPOINT (bước 1 vẫn được giữ).
    4. COMMIT.
    • SQL Server: SAVE TRANSACTION tên; ... ROLLBACK TRANSACTION tên;
    • MySQL: SAVEPOINT tên; ... ROLLBACK TO SAVEPOINT tên;

    Số dư đúng bằng 0 là hợp lệ. Hệ thống chấm gọi procedure 3 lần liên tiếp với from_acc = 1, to1 = 2, to2 = 3 (số tiền lần lượt 30tr+30tr, 5tr+5tr, 5tr+1tr) rồi in account_id, balance của tài khoản 1, 2, 3.

    • Định dạng đầu vào:

      Bảng Accounts(account_id, balance).

    • Định dạng đầu ra:

      account_id, balance (TAB) của tài khoản 1, 2, 3.

    Ví dụ:

    Đầu vào:

    Đầu ra:

    1	2000000.00
    2	43000000.00
    3	62000000.00

    Giải thích:

    TK1 có 67 triệu: lần 1 cả 2 bước thành công (còn 7tr); lần 2 bước 1 ok (còn 2tr) nhưng bước 2 âm nên chỉ rollback bước 2; lần 3 bước 1 đã âm nên rollback tất cả.

    Chủ đề

    📊 SQLSQLSQL: Buổi 10 – Index, Transaction & CapstoneTất cả môn học

    Đang tải editor...