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] SP chuyển tiền giữa hai tài khoản (ROLLBACK khi lỗi)

    📖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_TransferMoney với 3 tham số INPUT: from_acc (INT), to_acc (INT), amount (DECIMAL(18,2)). Procedure chuyển amount từ tài khoản from_acc sang to_acc trong một transaction (mọi thay đổi hoặc cùng thành công, hoặc không thay đổi gì). Không làm gì cả (không đổi số dư nào, không báo lỗi/không RAISERROR/THROW/SIGNAL) nếu:

    • amount <= 0, hoặc from_acc = to_acc;
    • tài khoản nguồn không tồn tại, không ACTIVE, hoặc số dư < amount (chuyển đúng bằng số dư thì được, số dư về 0);
    • tài khoản đích không tồn tại hoặc không ACTIVE.

    Gợi ý cách "trừ trước, kiểm tra sau": UPDATE trừ nguồn với điều kiện đủ tiền; nếu 0 dòng bị ảnh hưởng thì ROLLBACK; tiếp theo UPDATE cộng đích; nếu 0 dòng bị ảnh hưởng thì ROLLBACK (hoàn lại khoản đã trừ!). Cuối cùng COMMIT. (SQL Server: @@ROWCOUNT; MySQL: ROW_COUNT(), LEAVE nhãn để thoát procedure.)

    Hệ thống chấm gọi procedure 8 lần với các tình huống (thành công, không đủ tiền, đích đã đóng, đích không tồn tại, cùng tài khoản, số tiền âm, nguồn đã đóng...) rồi in account_id, balance của mọi tài khoản.

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

      Bảng Accounts(account_id, balance, status).

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

      account_id, balance (TAB), sắp theo account_id.

    Ví dụ:

    Đầu vào:

    Đầu ra:

    1	157000000.00
    2	18000000.00
    3	32000000.00
    4	8500000000.00
    5	3000000.00
    6	67000000.00
    7	98000000.00
    8	230000000.00
    9	1250000000.00
    10	32000000.00
    11	3400000000.00
    12	780000000.00
    13	410000000.00
    14	410000000.00
    15	32000000.00
    16	8000000.00
    17	1250000000.00
    18	410000000.00
    19	230000000.00
    20	120000000.00
    21	15000000.00
    22	780000000.00
    23	780000000.00
    24	120000000.00
    25	67000000.00
    26	67000000.00
    27	230000000.00
    28	120000000.00
    29	230000000.00
    30	98000000.00
    31	230000000.00
    32	98000000.00
    33	3400000000.00
    34	67000000.00
    35	8600000000.00
    36	15000000.00
    37	410000000.00
    38	3000000.00
    39	410000000.00
    40	410000000.00
    41	15000000.00
    42	1250000000.00
    43	15000000.00
    44	15000000.00
    45	230000000.00
    46	780000000.00
    47	1250000000.00
    48	45000000.00
    49	32000000.00
    50	32000000.00
    51	98000000.00
    52	32000000.00
    53	98000000.00
    54	8000000.00
    55	15000000.00
    56	32000000.00
    57	15000000.00
    58	120000000.00
    59	1250000000.00
    60	32000000.00
    61	1250000000.00
    62	67000000.00
    63	8000000.00
    64	410000000.00
    65	98000000.00
    66	3400000000.00
    67	67000000.00
    68	780000000.00
    69	410000000.00
    70	120000000.00
    71	230000000.00
    72	67000000.00
    73	8000000.00
    74	1250000000.00
    75	3400000000.00
    76	32000000.00
    77	780000000.00
    78	32000000.00
    79	8000000.00
    80	8000000.00
    81	98000000.00
    82	32000000.00
    83	3000000.00
    84	1250000000.00
    85	8000000.00
    86	3400000000.00
    87	780000000.00
    88	98000000.00
    89	410000000.00
    90	32000000.00
    91	780000000.00
    92	120000000.00
    93	8600000000.00

    Giải thích:

    Chỉ lần chuyển 1→2 (10 triệu) và 4→1 (100 triệu) thành công; các lần còn lại bị từ chối và không được để lại thay đổi nào (đặc biệt lần chuyển tới tài khoản đóng/không tồn tại không được trừ tiền nguồn).

    Chủ đề

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

    Đang tải editor...