Transaction và các tính chất bạn nên biết để dùng đúng cách

Phụ lục
transaction-va-cac-tinh-chat-ban-nen-biet-de-dung-dung-cach

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:

  1. Thực hiện rút tiền từ tài khoản #1.
  2. 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

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 để :

  • Tối ưu chi phí
  • Tiết kiệm thời gian
  • Tăng tốc tuyển dụng tối đa
  • Đăng ký ngay Devwork trong hôm nay để tuyển dụng những tài năng ưu tú nhất.

    Tag Cloud:

    Tác giả: quyenntt

    Link chia sẻ

    Bình luận

    Việc làm tại Devwork

    khám phá các cơ hội việc làm tốt nhất tại Devwork Xem thêm

    Bài viết liên quan

    Danh sách bài viết liên quan có thể bạn sẽ thích Xem thêm
    file-scss-la-gi

    SCSS là gì? Cách viết CSS như lập trình viên chuyên nghiệp

    08:06 19/06/2025

    Bạn mới bước vào thế giới front-end và nghe đâu đó về SCSS, SASS hay file .scss mà không hiểu gì? Đây là bài viết dành cho bạn. Với cách giải thích dễ hiểu, ví dụ thực tế và hướng dẫn từng bước, bạn sẽ biết SCSS là gì, cú pháp nó khác gì CSS, và học cách dùng SCSS đúng chuẩn như một lập trình viên....

    Bitbucket là gì? Cách hoạt động, ưu điểm và tính năng nổi bật

    04:31 19/06/2025

    Là một nền tảng quản lý mã nguồn mạnh mẽ, Bitbucket cung cấp nhiều tính năng hỗ trợ quy trình phát triển phần mềm hiện đại. Bài viết dưới đây sẽ giúp bạn hiểu rõ Bitbucket là gì, vì sao nó được ưa chuộng trong các team công nghệ, và những tính năng nổi bật nào khiến Bitbucket trở thành công cụ không thể thiếu.

    bitbucket-la-gi

    Prototype trong JavaScript là gì? Cách hoạt động & ví dụ minh hoạ

    04:25 19/06/2025

    Bạn đang loay hoay với câu hỏi prototype trong JavaScript là gì? Bạn không chắc mình hiểu đúng về proto, .prototype hay chuỗi kế thừa? Bài viết này sẽ giải mã toàn bộ những khái niệm quan trọng nhất về prototype, thông qua ví dụ thực tế, bảng so sánh và các lỗi điển hình mà người mới dễ mắc phải.

    prototype-trong-javascript-la-gi

    Figma là gì? Cách bắt đầu học Figma cho người mới

    10:18 18/06/2025

    Trên thị trường hiện nay có nhiều công cụ thiết kế UI/UX, nhưng Figma vẫn là một cái tên nổi bật. Vậy Figma là gì, nó khác gì với Adobe XD hay Sketch? Hãy cùng phân tích chi tiết trong bài viết để chọn được công cụ thiết kế phù hợp nhất với nhu cầu của bạn.

    figma-la-gi
    terminal-la-gi

    Terminal là gì? Tăng tốc làm việc với 12+ lệnh Terminal phổ biến

    17:00 17/06/2025

    Terminal là công cụ mạnh mẽ, cho phép bạn kiểm soát hệ thống, thao tác dự án và xử lý công việc nhanh hơn gấp nhiều lần. Bài viết này sẽ giúp bạn hiểu rõ terminal là gì, vai trò của nó trong lập trình, và giới thiệu các lệnh căn bản để bạn bắt đầu hành trình làm chủ dòng lệnh một cách dễ dàng.

    neural-network-la-gi

    Neural Network là gì? Tìm hiểu artificial, deep và convolutional neural network từ A-Z

    07:59 18/06/2025

    Neural network là gì? Đây là khái niệm cốt lõi trong lĩnh vực trí tuệ nhân tạo (AI), mô phỏng cách não bộ con người hoạt động. Trong bài viết này, Devwork sẽ giải đáp rõ ràng các khái niệm liên quan như artificial neural network là gì, deep neural network là gì và convolutional neural network là gì, cùng với ví dụ và ứng dụng thực tiễn.