
Chắc hẳn, các bạn đã nghe nhiều về transaction rồi. Nhưng không phải ai cũng hiểu và sử dụng thành thạo transaction. Nên bài hôm nay mình sẽ phân tích chi tiết về transaction và dựa trên ví dụ để chúng ta hiểu rõ hơn về nó.
Transaction là gì và mục đích sử dụng
- Là kỹ thuật xử lý nhiều tiến trình được thực hiện tuần tự.
- Các tiến trình đó có thể là: create, read, update hoặc delete.
- Nếu tất cả tiến trình thực hiện thành công, thì transaction sẽ được commit và dữ liệu sẽ được cập nhật vào DB.
Ví dụ về transaction
Transaction bên dưới đang có 2 tiến trình:
- Thực hiện rút tiền từ tài khoản #1.
- Sau đó, gửi tiền vào tài khoản #2.
Nhưng nếu tiến trình 1 bị lỗi, tức là tiền không thể rút từ tài khoản 1, thì tiến trình 2 không thể thực hiện, dữ liệu sẽ được phục hồi về ban đầu.
Tương tự như vậy, nếu tiến trình 1 thành công, nhưng tiến trình 2 gặp lỗi, thì dữ liệu không thể được commit và sẽ toàn bộ dữ liệu ở các tiến trình trước cũng sẽ phục hồi về ban đầu.
Cuối cùng, cả 2 tiến trình đều thực hiện thành công thì toàn bộ dữ liệu sẽ được commit vào DB.
Hướng dẫn cách tạo transaction
Cú pháp
Để bắt đầu một transaction:
START TRANSACTION;
Khi muốn trả về trạng thái DB ban đầu trước khi transaction hoạt động, hoặc có thể trả về SAVEPOINT:
ROLLBACK;
Cuối cùng, để cập nhật dữ liệu ở transaction đến DB:
COMMIT;
Ví dụ
Bạn còn nhớ ví dụ ở bài STORED PROCEDURE (SP) không? Nó sẽ thực hiện tạo ra thông tin khám bệnh, bằng cách đăng ký dữ liệu lần lượt vào các table medical_record, doctor_treatment. Nhưng trong trường hợp dữ liệu đăng ký thành công ở table medical_record, sau đó thực hiện thêm dữ liệu vào table doctor_treatment lại xảy ra lỗi. Vậy thì dữ liệu ở table trước đó (tức là table medical_record) đang bị dư thừa và có thể gây ra sự không đồng bộ về việc liên kết dữ liệu sau này.
Nên mình sẽ áp dụng transaction vào SP để giải quyết vấn đề trên, nếu một trong các tiến trình xảy ra lỗi, thì sẽ phục hồi lại trạng thái của DB về ban đầu.
delimiter //
CREATE PROCEDURE sp_register_treatment_transaction (p_doctor_id INT
, p_patient_id INT
, p_fee DOUBLE)
BEGIN
START TRANSACTION;
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
INSERT INTO medical_record (date_of_examination, fee, patient_id)
VALUES (CURDATE(), p_fee, p_patient_id);
INSERT INTO doctor_treatment (doctor_id, record_id)
VALUES (p_doctor_id, LAST_INSERT_ID());
SELECT d.doctor_id, d.last_name, mr.fee, p.patient_id, p.`name`
FROM doctor d
INNER JOIN doctor_treatment dt ON d.doctor_id = dt.doctor_id
INNER JOIN medical_record mr ON dt.record_id = mr.record_id
INNER JOIN patient p ON mr.patient_id = p.patient_id
WHERE mr.record_id = LAST_INSERT_ID();
COMMIT;
END;
END //
delimiter ;
Với dòng DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK, nó sẽ giúp thoát SP và rollback lại toàn bộ dữ liệu khi xảy ra lỗi ở một dòng lỗi nào đó trong transaction.
Các tính chất của transaction
Bao gồm 4 tính chất, kết hợp lại thành cụm là ACID.
Atomicity
Toàn bộ các tiến trình đều thành công, thì transaction sẽ được đánh giá là thành công. Ngược lại, nếu có một điểm bị lỗi thì tất cả tiến trình trước đó sẽ rollback.
Consistency
Các dữ liệu được thực hiện ở transaction phải đảm bảo theo các quy định, ràng buộc (constraints), cascade và trigger.
Isolation
Tất cả transaction sẽ thực hiện độc lập với các transaction khác.
Durability
Những cập nhật đến từ transaction vẫn luôn đảm bảo thành công, thậm chí nếu hệ thống có bị lỗi.
Kết luận
Tóm lại, một chuỗi lệnh được xảy ra và các lệnh cần có tính ảnh hưởng lẫn nhau thì transaction sẽ là giải pháp cho vấn đề này. Và các dữ liệu từ transaction sẽ luôn được đảm bảo.

Devwork là Nền tảng TUYỂN DỤNG IT CẤP TỐC với mô hình kết nối Nhà tuyển dụng với mạng lưới hơn 30.000 headhunter tuyển dụng ở khắp mọi nơi.Với hơn 1800 doanh nghiệp IT tin dùng Devwork để :
Tag Cloud:
Tác giả: quyenntt
Việc làm tại Devwork
Bài viết liên quan

Gross Domestic Product là gì & Tầm quan trọng của GDP
Gross Domestic Product là gì? Đây là câu hỏi cơ bản nhưng lại vô cùng quan trọng khi bàn về kinh tế vĩ mô. Devwork mang đến cho bạn bài phân tích toàn diện nhất về chỉ số kinh tế then chốt này, giúp bạn nắm vững cách GDP được tính toán và ứng dụng trong thực tiễn, từ hoạch định chính sách đến các quyết định đầu tư thông minh....
Middleware là gì? Chức năng & Phân loại chi tiết
Bạn đã bao giờ thắc mắc làm thế nào mà các hệ thống phần mềm phức tạp có thể giao tiếp với nhau một cách trơn tru? Trong bài viết này, Devwork sẽ giải đáp mọi thắc mắc của bạn về middleware là gì, vai trò quan trọng của nó trong kiến trúc phần mềm hiện đại và cách nó kết nối các thành phần khác nhau trong hệ thống.

Junior là gì? Cách thức thăng tiến từ Junior lên Senior nhanh nhất
Thuật ngữ "junior" xuất hiện phổ biến trong môi trường công việc hiện đại, đặc biệt trong lĩnh vực công nghệ thông tin. Devwork giúp bạn hiểu rõ junior là gì, sự khác biệt giữa junior và senior, cùng lộ trình phát triển sự nghiệp từ cấp độ junior đến các vị trí cao hơn.

Git là gì? Top 20+ Lệnh git căn bản bạn cần phải biết
Git là gì? Nếu bạn là một lập trình viên đang tìm kiếm công cụ quản lý mã nguồn hiệu quả, bài viết từ Devwork sẽ giúp bạn khám phá toàn diện về Git - hệ thống quản lý phiên bản phân tán được sử dụng phổ biến nhất hiện nay, cùng các lệnh cơ bản giúp bạn làm việc hiệu quả ngay từ đầu.


Default Gateway là gì? Cách kiểm tra Default Gateway NHANH & CHUẨN nhất
Bạn đang thắc mắc default gateway là gì và cách kiểm tra địa chỉ này trên các thiết bị như Windows, macOS hay điện thoại? Bài viết từ Devwork sẽ giúp bạn hiểu rõ vai trò của default gateway trong kết nối mạng, cách kiểm tra nhanh và xử lý lỗi thường gặp hiệu quả.

Generator là gì? Nguyên lý hoạt động & ứng dụng của Generator
Generator là gì? Bạn đang tìm hiểu về một khái niệm quan trọng trong lập trình hiện đại nhưng chưa nắm rõ ứng dụng? Bài viết từ Devwork sẽ giúp bạn hiểu tường tận về generator, cách thức hoạt động và các trường hợp ứng dụng thực tế giúp tối ưu hiệu suất cho dự án của bạn.
