MySQL cung cấp các công cụ cơ sở dữ liệu khác nhau để xử lý các truy vấn SQL. Các công cụ phổ biến nhất là MyISAM và InnoDB. Trong số hai công cụ này, InnoDB hỗ trợ các giao dịch có nghĩa là chúng tôi có thể cam kết và khôi phục để thực hiện một hoạt động liên quan đến nhiều truy vấn như một đơn vị duy nhất. Điều này cũng không thể xảy ra với MyISAM vì nó không hỗ trợ các giao dịch. InnoDB đáng tin cậy hơn so với MyISAM vì nó sử dụng nhật ký giao dịch để tự động khôi phục.
Ghi chú :MySQL đang có kế hoạch loại bỏ hoàn toàn MyISAM vì InnoDB có hiệu suất tốt hơn nhiều so với MyISAM.
Hướng dẫn này cung cấp các chi tiết để xử lý các giao dịch trong MySQL bằng BẮT ĐẦU GIAO DỊCH, COMMIT và ROLLBACK các câu lệnh. Mặc dù chúng ta có thể thực thi các truy vấn SQL riêng biệt, đó là kịch bản lý tưởng, nhưng trong một số trường hợp, chúng ta cần đảm bảo rằng tất cả các truy vấn cụ thể cho một tác vụ phải thành công hoặc không thành công do một trong hai truy vấn không thành công. Chúng ta có thể coi các nhiệm vụ đó như một đơn vị liên quan đến nhiều thao tác hoặc truy vấn để tạo, cập nhật hoặc xóa hàng. Do đó, trong một đơn vị giao dịch có nhiều hoạt động, nó phải thành công hoặc thất bại.
Người ta phải cẩn thận trong khi xử lý các giao dịch vì có một số câu lệnh nhất định không thể quay lại. Chúng bao gồm cơ sở dữ liệu CREATE / DROP, bảng CREATE / ALTER / DROP hoặc các quy trình được lưu trữ.
Thuộc tính của một giao dịch
Dưới đây được liệt kê là bốn thuộc tính tiêu chuẩn của một giao dịch. Chúng còn được gọi là ACID .
Tính nguyên tử - Nó đảm bảo rằng tất cả các hoạt động liên quan đến một nhiệm vụ hoặc đơn vị được hoàn thành thành công. Trong trường hợp không thực hiện được một trong hai hoạt động, giao dịch phải bị hủy bỏ và tất cả các hoạt động trước đó phải được khôi phục về trạng thái cũ. Có nghĩa là trong trường hợp không thực hiện được một giao dịch, không có hoạt động nào liên quan đến giao dịch đó phải thành công.
Nhất quán - Dữ liệu phải ở trạng thái nhất quán khi bắt đầu và kết thúc giao dịch để đảm bảo rằng cơ sở dữ liệu thay đổi trạng thái để phản ánh những thay đổi khi giao dịch được cam kết thành công.
Cô lập - Giao dịch phải được hoàn thành một cách cô lập ẩn các trạng thái trung gian với các giao dịch khác. Mỗi giao dịch phải hoạt động độc lập và minh bạch với nhau.
Độ bền - Nó đảm bảo rằng những thay đổi trong dữ liệu như một phần của giao dịch vẫn tồn tại ngay cả trong trường hợp hệ thống bị lỗi. Các thay đổi không được hoàn tác ngay cả trong trường hợp hệ thống bị lỗi.
Báo cáo giao dịch
BẮT ĐẦU GIAO DỊCH - Chúng tôi có thể sử dụng BẮT ĐẦU GIAO DỊCH hoặc BEGIN hoặc BẮT ĐẦU CÔNG VIỆC để bắt đầu giao dịch. BEGIN hoặc BẮT ĐẦU CÔNG VIỆC là bí danh của BẮT ĐẦU GIAO DỊCH.
CAM KẾT - Trong trường hợp thành công, CAM KẾT lệnh phải được đưa ra vào cuối giao dịch để duy trì các thay đổi.
QUAY LẠI - Trong trường hợp không thành công, ROLLBACK lệnh phải được đưa ra để khôi phục các trạng thái như trước khi bắt đầu giao dịch.
ĐẶT TỰ ĐỘNG - Sử dụng câu lệnh SET AUTOCOMMIT để tắt tính năng tự động cam kết khi bắt đầu giao dịch và bật tính năng này khi kết thúc giao dịch. Chỉ sử dụng trong trường hợp BẮT ĐẦU GIAO DỊCH hoặc BEGIN hoặc BẮT ĐẦU CÔNG VIỆC không được sử dụng để xử lý giao dịch.
Ví dụ về chuyển tiền
Tôi sẽ giải thích giao dịch bằng ví dụ chuyển tiền nội ngân hàng, trong đó một số tiền nhất định phải được chuyển từ tài khoản này sang tài khoản khác trong cùng một ngân hàng.
Ghi chú :Ví dụ này chỉ nhằm mục đích trình diễn và kịch bản thực tế chắc chắn sẽ khác dựa trên các quy tắc ngân hàng. Nó cũng giả định rằng các truy vấn giao dịch được xử lý theo chương trình và các giá trị trung gian được lưu trữ trong các biến phù hợp.
Trình tự các thao tác để thực hiện chuyển giao như sau:
- Lấy id khách hàng ghi nợ và ghi có từ yêu cầu và lưu trữ trong các biến.
- Nhận số tiền được chuyển từ yêu cầu và lưu trữ trong một biến.
- Bắt đầu giao dịch.
- Lấy số dư của khách hàng đầu tiên và lưu trữ trong một biến số.
- Lấy số dư của khách hàng thứ hai và lưu trữ trong một biến số.
- Hoàn nguyên giao dịch trong trường hợp khách hàng đầu tiên không có đủ số dư.
- Thêm giao dịch ghi nợ để phản ánh khoản khấu trừ từ tài khoản khách hàng đầu tiên.
- Khôi phục trong trường hợp không thành công.
- Thêm giao dịch tín dụng để phản ánh việc chuyển khoản vào tài khoản khách hàng thứ hai.
- Khôi phục trong trường hợp không thành công.
- Ghi lại quá trình chuyển giao.
- Khôi phục trong trường hợp không thành công.
- Cập nhật số dư của khách hàng đầu tiên.
- Khôi phục trong trường hợp không thành công.
- Cập nhật số dư của khách hàng thứ hai.
- Khôi phục trong trường hợp không thành công.
- Thực hiện giao dịch.
Dưới đây được đề cập là các truy vấn mẫu để thực hiện trình tự chuyển.
-- Start the transaction
START TRANSACTION;
-- Get balance of first customer
SELECT balance from ACCOUNT WHERE customer_id = 123124123;
-- Get balance of second customer
SELECT balance from ACCOUNT WHERE customer_id = 223124145;
-- Rollback in case of insufficient funds
ROLLBACK;
-- Add debit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(123124123, <amount>, 0, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add credit transaction
INSERT INTO transaction(customer_id,amount,type,reference) VALUES(223124145, <amount>, 1, <reference>);
-- Rollback in case of failure
ROLLBACK;
-- Add transfer transaction
INSERT INTO transfer(from,to,amount) VALUES(123124123, 223124145, <amount>);
-- Rollback in case of failure
ROLLBACK;
-- Update balance of first customer
UPDATE ACCOUNT SET balance = <balance - amount> WHERE customer_id = 123124123;
-- Rollback in case of failure
ROLLBACK;
-- Update balance of second customer
UPDATE ACCOUNT SET balance = <balance + amount> WHERE customer_id = 223124145;
-- Rollback in case of failure
ROLLBACK;
-- Commit the transaction
COMMIT;
Chúng tôi có thể thấy rõ rằng chúng tôi phải khôi phục trong trường hợp không thành công ở bất kỳ giai đoạn nào để trở về trạng thái ban đầu trước khi bắt đầu chuyển để phản ánh số dư thực tế của cả hai khách hàng.
Đây là cách chúng tôi có thể xử lý các giao dịch trong MySQL.