1. Transaction là gì?

Là một tiến trình xử lý có xác định điểm đầu và điểm cuối, được chia nhỏ thành các operation (phép thực thi) , tiến trình được thực thi một cách tuần tự và độc lập theo nguyên tắc hoặc tất cả đều thành công hoặc một thất bại thì toàn bộ tiến trình sẽ thất bại. Nếu việc thực thi một operation nào đó bị fail đồng nghĩa với việc dữ liệu phải rollback về trạng thái ban đầu. Vì thế, một transaction sẽ không được xem là thành công khi chỉ cần một thao tác đơn nào đó trong nó không hoàn thành.

Ví dụ đơn giản nhất là tiến trình cài đặt phần mềm hoặc gỡ bỏ phần mềm. Việc cài đặt được chia thành các bước, thực hiện tuần tự từ đầu đến cuối, nếu toàn bộ các bước thực thi thành công đồng nghĩa với việc tiến trình cài đặt hoặc gỡ bỏ phần mềm thành công và ngược lại, một phép thất bại thì tiến trình phải rollback lại tức sẽ không có bất kỳ thay đổi nào trên máy tính.

2. Kiểu của transaction

2.1. Flat Transaction:

Việc chia các operation(thực thị) là ngang hàng nhau. Thực thi các operation từ trái sang phải hoặc từ trên xuống dưới.

2.2. Nested Transaction

Việc thực thi các operation dựa theo nguyên tắc từ trong ra ngoài, khi thực thi theo nguyên tắc operation trong thực thi xong thì mới đến operation ngoài.

3. Các thuộc tính của transaction:

Transaction có 4 thuộc tính chuẩn sau đây:

  • Atomicity (tính tự trị): Đảm bảo rằng tất cả các hoạt động trong phạm vi một đơn vị làm việc là thành công hoàn toàn. Ngược lại, transaction sẽ bị hủy ngay tại điểm lỗi. Và các các họat động trước sẽ được quay lại đúng trạng thái trước đó của nó.
  • Consistency (tính nhất quán): Đảm bảo cơ sở dữ liệu thay đổi đúng trạng thái khi transaction kết thúc thành công.
  • Isolation (tính độc lập): Cho phép transaction hoạt động một cách độc lập và “trong suốt” (transparent) với các transaction khác.
  • 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 bị lỗi.

4. Rủi ro khi thực thi transaction

4.1. Việc thực thi operation bị hỏng:

Việc này sẽ dẫn tới transaction bị hỏng.

4. 2. Vấn đề về phần cứng và mạng:

Việc phần cứng hoặc mạng có vấn đề trong lúc đang thực thi transaction sẽ dẫn đến tiến trình xử lý thất bại.

4.3. Các vấn đề với dữ liệu dùng chung:

Dữ liệu là một tài nguyên dùng chung, nếu như có nhiều tiến trình xử lý đồng thời thực hiện trên dữ liệu sẽ xảy ra những rủi ro: write-write, write-read,… việc dữ liệu ghi cùng lúc dẫn tới hỏng dữ liệu hoặc dữ liệu đọc ra không đồng nhất với dữ liệu mới ghi vào.

5. Lệnh COMMIT và Lệnh ROLLBACK:

Đây là hai keyword được sử dụng chính trong các transaction MySQL.

– Khi một transaction hoàn chỉnh được hoàn thành thì lệnh COMMIT phải được đưa ra để mọi sự thay đổi đều được tác động đến tất cả các table liêu quan.

– Nếu bị lỗi, thì lệnh ROLLBACK nên được đưa ra để đưa tất cả các table liên quan với transaction về lại trạng thái trước đó.

Ta có thể điều khiển hành vi của một transaction bằng cách thiết lập một biến phiên, được gọi là Autocommit. Nếu Autocommit được thiết lập bằng 1, SET AUTOCOMMIT = 1 (default), thì mỗi lệnh SQL  được xem như một transaction hoàn chỉnh, điều này được duy trì cho đến khi nó kết thúc. Khi Autocommit được thiết lập bằng 0, SET AUTOCOMMIT = 0, thì một tập, có thứ tự, của các câu lệnh sẽ đóng vai trò như là một transaction và không có một hoạt động nào là được xuất phát cho đến có một lệnh Commit khác được đưa ra.

Một số lưu ý khi xây dựng và sử dụng:

Sự tuần tự của các lệnh là hoàn toàn độc lập với ngôn ngữ lập trình, vì thế, một tuần tự logic có thể được tạo ra trong ngôn ngữ mà ta đang sử dụng để tạo ra các ứng dụng như mong muốn.

  • Phải dùng lệnh BEGIN WORK để bắt đầu một transaction.
  • Có thể đưa ra một hoặc nhiều các câu lệnh sau: SELECT, INSERT, UPDATE hoặc DELETE.
  • Trước khi thực hiện phải kiểm tra để dảm bảo không còn lỗi nào và mọi thứ phải theo đúng yêu cầu đã đặt ra.
  • Nếu thấy có bất kỳ lỗi nào thì phải đưa ra câu lệnh ROLLBACK, ngược lại phải đưa ra câu lệnh COMMIT.

Ta có thể sử dụng các câu lệnh trên trong PHP bằng cách sử dụng hàm mysql_query():

Các loại table bảo vệ transaction (transaction-safe table) trong MySQL:

Ta không thể sử dụng nó một cách trực tiếp mà phải sử dụng trong chương trình MySQL. Trong trường hợp này, ta cần phải tạo ra các table theo cách đặc biệt. Có nhiều loại table hỗ trợ điều này, thông dụng nhất là InnoDB.

Nếu MySQL của chúng ta có cài đặt hỗ trợ các table InnoDB thì ta chỉ cần thêm định nghĩa Type = InnoDB vào câu lệnh Create table là được.

Tham khảo

http://en.wikipedia.org/wiki/Transaction_processing

http://en.wikipedia.org/wiki/Database_transaction

http://en.wikipedia.org/wiki/Atomic_transaction

https://viblo.asia/p/tim-hieu-ve-transaction-trong-mysql-RnB5pnxGZPG

Tìm hiểu về transaction, commit, and rollback trong Mysql