1. Transaction là gì?

Transaction (giao dịch) trong cơ sở dữ liệu là một nhóm thao tác được thực hiện như một đơn vị công việc. Những thao tác này thường liên quan đến việc thêm, sửa hoặc xóa dữ liệu và cần được quản lý để bảo đảm dữ liệu không rơi vào trạng thái không nhất quán khi xảy ra lỗi.

Ví dụ, khi người dùng chuyển tiền từ tài khoản A sang tài khoản B, hệ thống cần thực hiện hai thao tác: trừ tiền trong tài khoản A và cộng tiền vào tài khoản B. Nếu hệ thống trừ tiền ở tài khoản A thành công nhưng xảy ra lỗi trước khi cộng tiền vào tài khoản B, dữ liệu sẽ không còn chính xác nếu không có cơ chế xử lý phù hợp.

Transaction giúp giải quyết vấn đề này bằng cách nhóm các thao tác liên quan vào cùng một giao dịch. Nếu tất cả thao tác đều thành công, hệ thống xác nhận giao dịch. Nếu xảy ra lỗi, hệ thống có thể hủy các thay đổi thuộc giao dịch chưa được xác nhận.

Hai lệnh thường được sử dụng để quản lý transaction là COMMIT và ROLLBACK. COMMIT xác nhận các thay đổi của giao dịch, còn ROLLBACK hủy những thay đổi chưa được xác nhận trong giao dịch đó.

Transaction Database là gì? Vai trò trong hệ thống cơ sở dữ liệu

2. ACID là gì?

ACID là tập hợp bốn thuộc tính quan trọng giúp bảo đảm tính đáng tin cậy của transaction trong cơ sở dữ liệu, bao gồm Atomicity, Consistency, Isolation và Durability.

Bốn thuộc tính này giúp các thao tác dữ liệu được thực hiện an toàn hơn, đặc biệt trong những hệ thống có nhiều người dùng cùng truy cập hoặc thực hiện các giao dịch quan trọng như ngân hàng, thương mại điện tử và quản lý đơn hàng.

ACID không phải là một câu lệnh SQL riêng lẻ mà là tập hợp các nguyên tắc mà hệ quản trị cơ sở dữ liệu sử dụng để quản lý giao dịch. Mỗi thuộc tính giải quyết một khía cạnh khác nhau của việc bảo đảm dữ liệu chính xác và nhất quán.What is ACID transactions? | Decube

3. Atomicity – Tính nguyên tử

Atomicity có nghĩa là một transaction được xử lý theo nguyên tắc tất cả hoặc không có gì. Nếu toàn bộ thao tác trong giao dịch thành công, hệ thống có thể xác nhận giao dịch. Nếu một thao tác thất bại trước khi giao dịch được xác nhận, những thay đổi thuộc giao dịch sẽ được hủy theo cơ chế rollback.

Ví dụ, trong quá trình đặt hàng, hệ thống cần tạo đơn hàng và ghi nhận các sản phẩm thuộc đơn hàng đó. Nếu đơn hàng đã được tạo nhưng thao tác lưu chi tiết đơn hàng thất bại, hệ thống cần xử lý để tránh tình trạng đơn hàng chỉ được lưu một phần khi nghiệp vụ yêu cầu các thao tác này phải thành công cùng nhau.

Atomicity giúp hạn chế tình trạng dữ liệu bị thay đổi dở dang. Tuy nhiên, thuộc tính này chỉ bảo vệ những thao tác thực sự nằm trong transaction; các thao tác bên ngoài như gửi email hoặc gọi dịch vụ thanh toán cần có cơ chế xử lý riêng nếu muốn phối hợp nhất quán với giao dịch cơ sở dữ liệu.

4. Consistency – Tính nhất quán

Consistency có nghĩa là một transaction phải đưa cơ sở dữ liệu từ trạng thái hợp lệ này sang trạng thái hợp lệ khác, tuân theo những quy tắc và ràng buộc đã được thiết lập.

Ví dụ, hệ thống quản lý tài khoản có quy định số dư không được âm. Khi thực hiện giao dịch chuyển tiền, hệ thống phải kiểm tra số dư trước khi trừ tiền và bảo đảm kết quả cuối cùng không vi phạm quy tắc này.

Trong cơ sở dữ liệu, tính nhất quán được hỗ trợ bởi các ràng buộc như khóa chính, khóa ngoại, NOT NULL, UNIQUE và CHECK, kết hợp với các quy tắc nghiệp vụ do ứng dụng triển khai.

Nếu dữ liệu đầu vào vi phạm một ràng buộc được áp dụng, cơ sở dữ liệu có thể từ chối thao tác. Nhờ đó, hệ thống hạn chế lưu những dữ liệu không hợp lệ. Tuy nhiên, Consistency không tự động bảo đảm mọi quy tắc nghiệp vụ; lập trình viên vẫn cần thiết kế các kiểm tra phù hợp.

5. Isolation – Tính cô lập

Isolation là thuộc tính giúp các transaction hoạt động đồng thời mà hạn chế ảnh hưởng không mong muốn giữa chúng. Khi có nhiều người dùng cùng đọc hoặc cập nhật dữ liệu, hệ thống cần kiểm soát để những giao dịch không tạo ra kết quả sai lệch.

Ví dụ, một sản phẩm chỉ còn một chiếc trong kho nhưng hai người dùng cùng đặt mua gần như đồng thời. Nếu cả hai request đều đọc được số lượng tồn kho là một trước khi thực hiện cập nhật, hệ thống có nguy cơ xác nhận nhiều đơn hàng hơn số lượng thực tế.

Cơ chế cô lập giao dịch giúp kiểm soát những tình huống như vậy, tùy theo mức độ cô lập và cách thiết kế câu truy vấn. Các hệ quản trị cơ sở dữ liệu có thể hỗ trợ nhiều mức cô lập khác nhau, chẳng hạn Read Committed, Repeatable Read và Serializable.

Mức cô lập càng cao thường cung cấp các bảo đảm mạnh hơn nhưng có thể làm giảm khả năng xử lý đồng thời hoặc tăng nguy cơ giao dịch phải thử lại. Vì vậy, cần chọn mức phù hợp với yêu cầu nghiệp vụ và hệ quản trị cơ sở dữ liệu đang sử dụng.

6. Durability – Tính bền vững

Durability có nghĩa là sau khi transaction đã được xác nhận thành công bằng COMMIT, những thay đổi của giao dịch được bảo đảm tồn tại theo các cam kết về độ bền của hệ quản trị cơ sở dữ liệu, kể cả khi xảy ra sự cố hệ thống thuộc phạm vi được bảo vệ.

Ví dụ, khi khách hàng đặt hàng thành công và server đã xác nhận giao dịch, thông tin đơn hàng cần được lưu lại để hệ thống có thể truy xuất sau đó, thay vì biến mất khi ứng dụng khởi động lại.

Các hệ quản trị cơ sở dữ liệu thường sử dụng những cơ chế như ghi nhật ký giao dịch và phục hồi dữ liệu để hỗ trợ tính bền vững. Tuy nhiên, mức độ bảo vệ thực tế còn phụ thuộc vào cấu hình hệ thống, chính sách sao lưu và các điều kiện triển khai.

Durability rất quan trọng đối với những hệ thống lưu trữ dữ liệu có giá trị cao như giao dịch tài chính, đơn hàng và thông tin thanh toán.

7. Ví dụ sử dụng Transaction trong SQL

Trong PostgreSQL và MySQL, lập trình viên có thể sử dụng transaction để nhóm nhiều thao tác dữ liệu vào cùng một giao dịch. Ví dụ sau minh họa việc chuyển tiền giữa hai tài khoản:

BEGIN;

UPDATE accounts
SET balance = balance - 100
WHERE id = 1 AND balance >= 100;

UPDATE accounts
SET balance = balance + 100
WHERE id = 2;

COMMIT;

Trong ví dụ này, BEGIN bắt đầu transaction, hai câu lệnh UPDATE thực hiện việc trừ tiền và cộng tiền, còn COMMIT xác nhận các thay đổi.

Tuy nhiên, đoạn code trên chỉ minh họa cách viết transaction cơ bản, chưa đủ để triển khai chuyển tiền an toàn trong thực tế. Ứng dụng cần kiểm tra số lượng bản ghi được cập nhật, xác nhận tài khoản nhận tồn tại và xử lý lỗi bằng ROLLBACK khi điều kiện nghiệp vụ không được đáp ứng. Cần chú ý rằng nếu câu lệnh trừ tiền không cập nhật bản ghi nào, câu lệnh cộng tiền phía sau vẫn có thể chạy nếu ứng dụng không kiểm tra kết quả.

Vì vậy, transaction cần được kết hợp với kiểm tra dữ liệu và xử lý lỗi phù hợp. Trong các hệ thống quan trọng, còn cần xem xét việc khóa dữ liệu, chống xử lý trùng request và ghi nhận lịch sử giao dịch.

8. Kết luận

Transactions and ACID là những kiến thức quan trọng khi làm việc với cơ sở dữ liệu, đặc biệt đối với các ứng dụng có nhiều thao tác dữ liệu liên quan đến nhau. Transaction giúp nhóm các thao tác thành một đơn vị công việc, còn ACID mô tả bốn thuộc tính hỗ trợ tính nguyên tử, tính nhất quán, tính cô lập và tính bền vững của giao dịch.

Qua quá trình tìm hiểu, mình hiểu rằng sử dụng transact

Bài viết khác

Language Switching trong Flutter

        Trong quá trình phát triển ứng dụng di động, khả năng hỗ trợ nhiều ngôn ngữ ngày càng trở nên quan trọng. Một ứng dụng chỉ sử dụng duy nhất một ngôn ngữ có thể gặp khó khăn khi tiếp cận người dùng ở các quốc gia và khu vực khác […]

UTC & Local Time Conversion

Trong thời đại toàn cầu hóa, con người thường xuyên làm việc, học tập và giao tiếp với những người ở các quốc gia khác nhau. Một cuộc họp trực tuyến có thể được tổ chức tại Việt Nam, nhưng người tham gia lại đang ở Hoa Kỳ, Anh, Nhật Bản hoặc Australia. Vì vậy, […]

Logging / Monitoring / CI/CD

1. Logging / Monitoring / CI/CD là gì? Trong quá trình phát triển phần mềm, việc viết code để ứng dụng chạy được chỉ là một phần của công việc. Khi đưa ứng dụng vào sử dụng thực tế, lập trình viên còn phải quan tâm đến nhiều vấn đề khác như ứng dụng có […]

Docker

1. Docker là gì? Docker là một nền tảng được sử dụng để đóng gói, triển khai và chạy ứng dụng trong các môi trường độc lập, được gọi là Container. Docker giúp lập trình viên đưa mã nguồn, thư viện, các gói phụ thuộc và những thành phần cần thiết để chạy ứng dụng […]

Unit Testing và Integration Testing

1. Unit Testing và Integration Testing là gì? Unit Testing và Integration Testing là hai phương pháp kiểm thử phần mềm thường được sử dụng trong quá trình phát triển ứng dụng. Mục đích của hai phương pháp này là kiểm tra xem chương trình có hoạt động đúng theo yêu cầu hay không, đồng […]

Message Broker

1. Message Broker là gì? Message Broker là một thành phần trung gian được sử dụng để tiếp nhận, quản lý và chuyển tiếp thông điệp giữa các ứng dụng hoặc các thành phần trong một hệ thống phần mềm. Công nghệ này thường xuất hiện trong những hệ thống Backend, kiến trúc Microservices và […]

Leave a Reply

Your email address will not be published. Required fields are marked *