Mô tả định nghĩa về giao dịch, cách xử lý lỗi và các isolation level

Mô tả định nghĩa về giao dịch, cách xử lý lỗi và các isolation level

Chia sẻ kiến thức 05/05/2022

Một giao dịch cơ sở dữ liệu sẽ được thực hiện trong một ứng dụng web. Bài viết này, chúng ta cùng FUNiX mô tả định nghĩa về giao dịch, cách xử lý lỗi và các isolation level. Nắm chắc các kiến thức này, bạn sẽ hạn chế được các xung đột và hiệu năng trong hệ thống có nhiều users.

>> Khóa học lập trình cơ bản

>> Kỹ thuật lập trình PHP

1. Mô tả định nghĩa về giao dịch và cách xử lý lỗi

Để hiểu toàn bộ nội dung mô tả định nghĩa về giao dịch, cách xử lý lỗi và các isolation level. Trước hết, chúng ta hãy cùng tìm hiểu về giao dịch cũng như một số cách xử lý lỗi tương ứng.

Giao dịch là một đơn vị thực hiện chương trình truy xuất, có thể cập nhật nhiều hạng mục dữ liệu. Một giao dịch thường là kết quả của việc thực hiện một chương trình người dùng được viết trong một ngôn ngữ thao tác dữ liệu mức cao hoặc một ngôn ngữ lập trình.

Theo đó, chúng được phân cách bởi các câu lệnh (hoặc các lời gọi hàm) có dạng begin transaction và end transaction. Giao dịch bao gồm tất cả các hoạt động được thực hiện giữa begin và end transaction.

Định nghĩa về giao dịch
Định nghĩa về giao dịch

Để đảm bảo tính toàn vẹn của dữ liệu, giao dịch cần duy trì các tính chất sau trong hệ CSDL. Đó là:

  • Tính nguyên tử (Atomicity)
  • Tính nhất quán (consistency)
  • Tính cô lập (Isolation)
  • Tính bền vững (Durability)

Những tính chất này thường được gọi là các tính chất ACID (Chữ cái đầu của bốn tính chất). 

Thông thường, nếu không có sự cố, tất cả các giao dịch đều hoàn tất thành công. Tuy nhiên, trong thực tế một giao dịch có thể không thể hoàn tất việc thực hiện của nó. Giao dịch như vậy được xem là bị lỗi.

Để xử lý lỗi, trước hết chúng ta cần đảm bảo được tính nguyên tử, nghĩa là một giao dịch bị lỗi  không được phép làm ảnh hưởng tới trạng thái của CSDL. Như vậy, bất kỳ thay đổi nào mà giao dịch bị lỗi này phải bị huỷ bỏ. Mỗi khi các thay đổi do giao dịch bị lỗi bị huỷ bỏ, ta nói rằng giao dịch bị cuộn lại (rolled back). 

Một giao dịch phải ở trong một trong các trạng thái sau:

  • Hoạt động (Active). Trạng thái khởi đầu; giao dịch giữ trong trạng thái này trong khi nó đang thực hiện.
  • Được bàn giao bộ phận (Partially Committed). Sau khi lệnh cuối cùng được thực hiện.
  • Thất bại (Failed). Sau khi phát hiện rằng việc thực hiện không thể tiếp tục được nữa.
  • Bỏ dở (Aborted). Sau khi giao dịch đã bị cuộn lại và CSDL đã phục hồi lại trạng thái của nó trước khi khởi động giao dịch.
  • Được bàn giao (Committed). Sau khi hoàn thành thành công giao dịch.

Giả thiết, sự cố hệ thống không gây ra sự mất dữ liệu trên đĩa, một giao dịch đi vào trạng thái Failed sau khi hệ thống xác định rằng giao dịch không thể tiến triển bình thường được nữa (đây là do lỗi phần cứng hoặc phần mềm). Như vậy, giao dịch phải được cuộn lại rồi chuyển sang trạng thái bỏ dở. 

2. Các isolation level

Isolation level là một thuộc tính của transaction, nó quy định mức độ cô lập của dữ liệu mà transaction có thể truy nhập vào khi dữ liệu đó đang được cập nhật bởi một transaction khác. 

SQL cung cấp các mức isolation level sau xếp theo thứ tự tăng dần của mức độ cô lập của dữ liệu đó là: Read Uncommitted, Read Commited, Repeatable Read, Serializable, và Snapshot. Trong đó:

Isolation level là một thuộc tính của transaction
Isolation level là một thuộc tính của transaction.
  • Snapshot

Mức độ này chỉ có thể sử dụng khi row versioning được bật.

  • Serializable

Serializable là mức cô lập cao nhất, các transactions hoàn toàn tách biệt với nhau. SQL đặt read và write lock trên dữ liệu cho tới khi transaction kết thúc. Vì thế hiện tượng phantom read sẽ không còn ở mức này.

  • Repeatable read

Mức isolation này hoạt động như mức read committed nhưng nâng thêm một nấc nữa bằng cách ngăn không cho transaction ghi vào dữ liệu đang được đọc bởi một transaction khác. Nó chủ cho phép đến khi transaction khác đó hoàn tất.

  • Read committed

Mức isolation này là mặc định, nếu bạn không đặt gì cả thì transaction sẽ hoạt động ở mức này. Transaction sẽ không đọc được dữ liệu đang được cập nhật mà phải đợi đến khi việc cập nhật thực hiện xong. Vì thế nó tránh được dirty read như ở mức trên nhưng có thể xảy ra phantom read.

  • Read uncommitted

Read uncommitted là mức cô lập thấp nhất. Khi transaction thực hiện ở mức này, các truy vấn vẫn có thể truy nhập vào các bản ghi đang được cập nhật bởi một transaction khác và nhận được dữ liệu tại thời điểm đó. Dù dữ liệu đó chưa được commit (uncommited data), việc này sẽ dẫn đến tình trạng Dirty read.

Khi số lượng users thao tác với dữ liệu ngày một tăng, việc quản lý thao tác dữ liệu một cách hiệu quả là điều quan trọng và cần thiết. Mong rằng, sau khi tham khảo bài viết này của FUNiX, bạn sẽ biết mô tả định nghĩa về giao dịch, cách xử lý lỗi và các isolation level. Chúc bạn thành công!

Phạm Thị Thanh Ngọc

ĐĂNG KÝ TƯ VẤN HỌC LẬP TRÌNH TẠI FUNiX

Bình luận (
0
)

Bài liên quan

  • Tầng 0, tòa nhà FPT, 17 Duy Tân, Q. Cầu Giấy, Hà Nội
  • info@funix.edu.vn
  • 0782313602 (Zalo, Viber)        
Chat Button
Chat với FUNiX GPT ×

yêu cầu gọi lại

error: Content is protected !!