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.
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.
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.
Transaction có 4 thuộc tính chuẩn sau đây:
Việc này sẽ dẫn tới transaction bị hỏ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.
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.
Đâ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.
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