Tìm hiểu về Transaction trong MySQL

Đối với những người học Công nghệ thông tin, chắc hẳn khái niêm Transaction không còn gì xa lạ, nhưng đối với những người mới làm quen với lĩnh vực này hẳn nhiều bạn vẫn còn lạ lẫm với những khái niệm liên quan đến Transaction. Cũng là một người mới, tôi xin phép chia sẻ những gì tìm hiểu được để các bạn có thể tham khảo.

1. Transaction là gì?

Có thể hiểu Transaction 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 các operation đó theo nguyên tắc hoặc tất cả đều thành công hoặc một operation thất bại thì toàn bộ tiến trình 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.

Có thể lấy ví dụ về 1 Transaction đơ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

Các kiểu transaction khác nhau được phân biệt bằng việc chia các operation như thế nào. Có hai mô hình transaction như sau:

2.1. Flat Transaction – Transaction ngang hàng:

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

2.2. Nested Transaction – Transaction lồng nhau

Việc thực thi các operation dựa theo nguyên tắc từ trong ra ngoài. Như vậy khi nhìn vào hình vẽ chúng ta thấy các operation ở dạng này có vẻ phụ thuộc vào nhau nhưng khi thực thi thì là độc lập 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

Mô hình ACID được gắn chặt với cơ sở dữ liệu quan hệ (Relation DB). Tuy nhiên, xét về transaction nói chung, chúng ta cũng có thể áp dụng các thuộc tính này vào.

3.1. Atomicity – tính đơn vị:

Một transaction xác định ranh giới của nó rất rõ ràng, tức xác định điểm bắt đầu và kết thúc của tiến trình. Như vậy có thể coi nó như một đơn vị thực thi và đơn vị thực thi này thực hiện theo nguyên tắc “all or nothing”. Nghĩa là nếu một thành phần nào đó trong transaction thực thi hỏng (fail) thì đồng nghĩa với việc không có gì xảy ra tức không có gì thay đổi về mặt dữ liệu.

3.2. Consistency – nhất quán:

Dữ liệu nhất quán với transaction ở thời điểm bắt đầu và kết thúc. Nhất quán ở transaction là strong consistency. Để tìm hiểu kỹ hơn về tính nhất quán, xin đọc lại bài viết NoSQL.

3.3 Isolation – độc lập:

Nếu hai transaction thực thi cùng lúc thì nguyên tắc thực thi là thực thi độc lập. Nghĩa là một transaction không thể “nhìn thấy” một transaction khác. “Không nhìn thấy” ở đây là không tác động lẫn nhau, chủ yếu trên dữ liệu.

3.4 Durability – bền vững:

Dữ liệu của transaction sau khi thực thi xong được cố định, chính thức và bền vững. Nghĩa là những thay đổi đã được cố định, không có chuyện có thể chuyển lại trạng thái dữ liệu lúc trước khi thực hiện transaction.

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

Có ba loại rủi ro chính khiến việc thực thi một transaction có thể bị fail.

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

rõ ràng việc này sẽ dẫn tới transaction bị hỏng. Điều này đã được quy định rõ trong định nghĩa về transaction.

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:

Đây là vấn đề khó nhất. Rõ ràng data là một tài nguyên dùng chung, do đó sẽ có những nguy cơ mà transaction gặp phải khi xử lý dữ liệu dùng chung này. Ta sẽ xem xét kỹ hơn dưới đây. Như chúng ta đã biết, phần mềm viết ra là để xử lý dữ liệu, 2 operations (phép) căn bản của phần mềm với dữ liệu là đọc và ghi (read và write) trong đó phép write lại được chia nhỏ thành 3 operations nhỏ hơn là insert (thêm mới), update (sửa), delete (xóa). 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 các phép 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,… sẽ đề cập kỹ hơn trong phần tiếp theo dưới đây.

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

Trong MySQL, Transaction 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 . Trong MySQL, transaction bắt đầu với câu lệnh BEGIN WORK và kết thúc với một trong hai câu lệnh COMMIT hoặc ROLLBACK. Các câu lệnh SQL đặt giữa [BEGIN WORK … COMMIT/ROLLBACK] là phần chính của một transaction.

5.1. Lệnh COMMIT:

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.

5.2. Lệnh ROLLBACK :

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 (trong hoặc ngoài transaction) đượ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. Ta có thể sử dụng các câu lệnh này trong PHP bằng cách sử dụng hàm mysql_query().

Tài liệu tham khảo:

http://en.wikipedia.org/wiki/Transaction_processing http://en.wikipedia.org/wiki/Database_transaction http://en.wikipedia.org/wiki/Atomic_transaction http://kienthucweb.net/tim-hieu-ve-transaction-trong-mysql.html