Tìm hiểu về Transaction trong MySQL

Tìm hiểu về Transaction trong MySQL

Ở bài viết Tìm hiểu về các Storage Engine trong MySQL mình có giới thiệu cho các bạn về InnoDB. Đây là một engine hỗ trợ transaction để đảm bảo an toàn, nhất quán về dữ liệu khi thực hiện một khối câu lệnh SQL. Vì thế để có thể sử dụng Transaction cho ứng dụng của mình được thì các table (bảng dữ liệu) chạy trong giao dịch của bạn phải đặt storage engine là InnoDB.

Transaction (Giao dịch) là một nhóm câu lệnh SQL, xử lý có tuần tự các thao tác trên cơ sở dữ liệu nhưng được xem như là một đơn vị duy nhất. Vì vậy, một transaction sẽ không được coi là thành công nếu như trong quá trình xử lý có một thao tác trong nó không được hoàn thành. Trường hợp này, transaction được coi là thất bại (giao dịch không thành công).

tim-hieu-ve-transaction-trong-mysql

Tìm hiểu về Transaction trong MySQL

Một số ví dụ trong thực tế cần phải sử dụng Transaction để giải quyết

  • A chuyển cho B: 50.000 đ thông qua Internet Banking, A đã bị trừ 50.000 đ vào số dư, nhưng đang cập nhật số dư mới cho B thì server bị mất điện. Hệ thống cần phải thực hiện + lại số dư cho A.
  • A đang rút tiền tại máy ATM, số dư đã bị trừ nhưng tiền chưa nhả ra thì hệ thống bị sự cố
  • …….

Thuộc tính của Transaction

Transaction có một chuẩn gọi là ACID bao gồm 4 thuộc tính chuẩn.

  • Atomicity (Tính tự trị): Đảm bảo tất cả các thao tác, hành động trong phạm vi một đơn vị giao dịch là thành công hoàn toàn. Ngược lại, transaction sẽ bị dừng ngay ở thời điểm lỗi, và sẽ phục hồi quay ngược lại thời điểm chưa xảy ra sự thay đổi.
  • Consistency (Tính nhất quán): Đảm bảo tất cả các thao tác trên cơ sở dữ liệu được thay đổi sau khi giao dịch thành công và không xảy ra lỗi.
  • Isolation (Tính cô lập): Đảm bảo transaction này hoạt động độc lập so với transaction khác. Ví dụ như ở máy A đang thực hiện thì sẽ không liên quan tới giao dịch ở máy B.
  • Durability (Tính bền vững): Đảm bảo kết quả hoặc tác động của transaction vẫn luôn tồn tại, kể cả khi hệ thống xảy ra lỗi.

Hướng dẫn sử dụng Transaction

Trong MySQL, một transaction được bắt đầu với câu lệnh: START TRANSACTION;BEGIN;. Nhưng trước khi sử dụng câu lệnh này mình khuyên các bạn sử dụng câu lệnh: SET autocommit = 0 ở trước, mặc định thuộc tính autocommit = 1, Transaction sẽ được tự động hoàn thành mà không cần phải sử dụng COMMIT hoặc ROLLBACK.

  • Khi một transaction hoàn thành thì cần đưa ra lệnh COMMIT để mọi hành động tác động tới các table được thực sự thay đổi.
  • Khi một transaction thất bại thì cần đưa ra lệnh ROLLBACK để hủy toàn bộ mọi hành động, phục hồi dữ liệu về trạng thái trước khi bắt đầu transaction.

Ví dụ mẫu:

Ví dụ này của mình chỉ mang tính minh họa các cú pháp mà một Transaction sử dụng. Ở bài viết sau mình sẽ hướng dẫn các bạn kết hợp với PHP để có thể hình dung rõ ràng hơn về 2 cú pháp: COMMIT và ROLLBACK.

Một số lưu ý khi sử dụng Transaction

Các câu lệnh SQL thực hiện tuần tự trong một Transaction là hoàn toàn độc lập so với ngôn ngữ lập trình. Vì vậy một khối lệnh SQL có thể được xây dựng tuần tự bởi ngôn ngữ lập trình mà bạn đang sử dụng để có thể tạo ra được ứng dụng mong muốn.

  • Cần sử dụng storage engine InnoDB cho table dữ liệu.
  • Đảm bảo một client tạo ra một phiên kết nối với MySQL để cô lập được các transaction ở các client khác nhau. (Ví dụ như không sử dụng hàm pconnect trong mysql khi sử dụng Transaction)
  • Bắt buộc phải sử dụng START TRANSACTION;BEGIN; để bắt đầu một Transaction
  • Có thể thực hiện nhiều câu lệnh SELECT, INSERT, UPDATE, DELETE sau lệnh BEGIN;
  • Đảm bảo kiểm tra nếu toàn bộ các câu lệnh thực hiện thành công, chính xác thì thực hiện COMMIT, ngược lại có một lệnh thất bại thì thực hiện lệnh ROLLBACK

Lời kết

Transaction trong MySQL là một chủ đề dài mà chúng ta cần phải cùng nhau tìm hiểu đi sâu hơn nữa. Ví dụ như thiết lập tính cô lập, ….. Ở bài viết này mình đã giới thiệu cơ bản cho các bạn biết về Transaction, đây là một vấn đề cực kỳ quan trọng trong các bài toán thực tế mà chúng ta gặp phải. Vì vậy, mình nghĩ rằng các bạn cần nghiên cứu kỹ về Transaction để xây dựng được các ứng dụng tốt giải quyết các bài toán trong cuộc sống.