python-128Đọc toàn bộ đề miễn phí

Quản lý Ngữ cảnh Giao dịch với __enter__ và __exit__ Rollback

Cài đặt lớp DatabaseTransactionContext(db: dict):

PythonNâng cao30 phút

Tiến độ của tôi ở bài này

Điểm được lưu vào tài khoản sau khi chấm bài.

Đang tải điểm của bạn…

Kiến thức và chủ đề

oopcontext managerrollbackdunder enter exit

Kiến thức tiên quyết: context managers, deep copy, exception propagation.

Nội dung đề bài

Mục tiêu kiến thức

  • Hiểu sâu giao thức Context Manager: __enter__ và __exit__.
  • Thực hiện cơ chế Rollback trạng thái khi xảy ra ngoại lệ bên trong khối with.
  • Lan truyền ngoại lệ ra ngoài (không nuốt lỗi vô cớ) bằng cách trả về False trong __exit__.

Mô tả bài toán

Cài đặt lớp DatabaseTransactionContext(db: dict):

  • __init__(self, db: dict): Nhận tham chiếu đến từ điển db đại diện cho cơ sở dữ liệu in-memory.
  • __enter__(self):
  • Tạo một checkpoint bản sao độc lập của db (dict(self.db) hoặc sao chép nông/sâu phù hợp).
  • Trả về đối tượng giao dịch (hoặc self.db).
  • __exit__(self, exc_type, exc_val, exc_tb) -> bool:
  • Nếu xảy ra ngoại lệ (exc_type is not None):
  • Hoàn nguyên (Rollback) toàn bộ nội dung của self.db về trạng thái checkpoint ban đầu (xóa các key mới thêm, phục hồi các key đã sửa/xóa).
  • Trả về False để Python lan truyền ngoại lệ lên trên.
  • Nếu không có ngoại lệ: Commit thay đổi và trả về True hoặc None.

Input

  • Các tham số truyền vào hàm/lớp DatabaseTransactionContext hoặc dữ liệu đầu vào theo định dạng mô tả.

Output

  • Kết quả trả về của hàm/lớp DatabaseTransactionContext hoặc dữ liệu in ra màn hình theo đúng đặc tả.

Ràng buộc

  • Thời gian chạy tối đa: 1000ms.
  • Giới hạn bộ nhớ: 256MB.
  • Dữ liệu đầu vào tuân thủ đúng kiểu dữ liệu và miền giá trị được mô tả.

Ví dụ 1

Input

DatabaseTransactionContext(initial_db={'users': 10}, raise_exception=True)

Output

{'users': 10}

Giải thích

Hàm được gọi với các tham số mẫu trên và trả về kết quả chính xác theo yêu cầu.

Ví dụ 2

Input

DatabaseTransactionContext(initial_db={'users': 10}, raise_exception=False)

Output

{'users': 10, 'key1': 'committed_val'}

Giải thích

Hàm được gọi với bộ tham số thứ hai và trả về kết quả tương ứng theo thiết kế.

3 cấp độ gợi ýMở dần khi bạn thật sự cần hỗ trợ.
Phân tích lời giảiGiải thích hướng tư duy và thuật toán.
Code tham khảoDùng để đối chiếu sau khi tự làm.

Gợi ý và lời giải chỉ mở sau khi bạn bấm Nộp bài. Giáo viên và quản trị viên mở được ngay.