Quay lại

Transaction là gì? và cách hoạt động của Transaction trong SQL Chuyên mục Bài Viết Hay    2024-02-23    54 Lượt xem    37 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Transaction là gì? và cách hoạt động của Transaction trong SQL

Transaction là gì?

Trong SQL, một transaction(giao dịch) là một chuỗi của một hoặc nhiều hoạt động SQL (câu truy vấn, Insert, Update, Delete, v.v.) được xem như một đơn vị logic làm việc duy nhất. transaction đảm bảo tính toàn vẹn và nhất quán của cơ sở dữ liệu bằng cách cho phép nhiều hoạt động được nhóm lại với nhau, với sự đảm bảo rằng hoặc tất cả các hoạt động được hoàn thành thành công và được ghi nhận vào cơ sở dữ liệu, hoặc nếu bất kỳ hoạt động nào thất bại, toàn bộ transaction sẽ được quay trở lại và không có thay đổi nào được thực hiện trong cơ sở dữ liệu.

Các thuộc tính chính của một transaction trong SQL thường được tóm tắt bằng việc viết tắt ACID:

  1. Atomicity: Có nghĩa là chúng được xem như một đơn vị logic làm việc duy nhất. Tất cả các hoạt động trong một transaction đều được thực hiện thành công và được cam kết vào cơ sở dữ liệu, hoặc nếu bất kỳ hoạt động nào thất bại, toàn bộ transaction sẽ bị quay trở lại và không có thay đổi nào được thực hiện trong cơ sở dữ liệu.

  2. Consistency: Transaction giữ cho cơ sở dữ liệu được duy trì nhất quán. Điều này có nghĩa là cơ sở dữ liệu chuyển từ một trạng thái nhất quán sang một trạng thái nhất quán khác sau khi transaction hoàn tất thành công.

  3. Isolation: Transaction được cô lập với nhau, có nghĩa là các hoạt động trong một transaction không hiển thị cho các transaction khác cho đến khi transaction hoàn tất. Sự cô lập đảm bảo rằng các transaction có thể hoạt động độc lập mà không làm phiền lẫn nhau.

  4. Durability: Khi một transaction được commit (cam kết) và các thay đổi được thực hiện vào cơ sở dữ liệu, chúng là vĩnh viễn và sẽ không bị mất, ngay cả khi có một sự cố hệ thống. Các thay đổi được thực hiện bởi các transaction đã commit là vững vàng và sẽ tồn tại trong cơ sở dữ liệu.

Transaction hoạt động như thế nào trong SQL

  1. Begin Transaction (Bắt Đầu): Bắt đầu một transaction mới.

  2. Execute SQL Statements (Thực Hiện Các Câu Lệnh SQL): Trong transaction, thực hiện các câu lệnh SQL mà bạn muốn bao gồm là một phần của transaction. Những câu lệnh này có thể là bất kỳ thao tác SQL nào như SELECT, INSERT, UPDATE, DELETE, v.v.

  3. Commit (Cam Kết): Nếu tất cả các câu lệnh SQL trong transaction hoàn thành thành công và bạn muốn làm cho các thay đổi trở nên vĩnh viễn, bạn cam kết transaction. Điều này cam kết tất cả các thay đổi được thực hiện bởi transaction vào cơ sở dữ liệu.

  4. Rollback (Quay lại): Nếu xảy ra bất kỳ lỗi nào trong quá trình transaction hoặc nếu bạn quyết định loại bỏ các thay đổi được thực hiện bởi transaction, bạn quay lại transaction. Điều này hoàn nguyên lại tất cả các thay đổi được thực hiện bởi transaction về trạng thái trước khi transaction bắt đầu.

Cơ chế này đảm bảo rằng các thay đổi trong transaction sẽ được áp dụng vào cơ sở dữ liệu chỉ khi tất cả các thao tác trong transaction đó hoàn thành thành công. Nếu có bất kỳ lỗi nào xảy ra, cơ sở dữ liệu sẽ được trả về trạng thái ban đầu một cách an toàn, mà không ảnh hưởng đến tính toàn vẹn của dữ liệu.

Cách tạo Transaction trong SQL

Dưới đây là một ví dụ về cách sử dụng transaction trong SQL:

BEGIN TRANSACTION; -- Bắt đầu giao dịch

-- Thực hiện các câu lệnh SQL
INSERT INTO Orders (CustomerID, OrderDate) VALUES (1, GETDATE());
UPDATE Customers SET Balance = Balance - 100 WHERE CustomerID = 1;

-- Cam kết giao dịch nếu mọi thứ thành công
COMMIT;​

Trong ví dụ trên:

  • Chúng ta bắt đầu một transaction mới bằng BEGIN TRANSACTION.
  • Chúng ta thực hiện một số câu lệnh SQL để insert một order mới vào bảng Orders và cập nhật số dư của một khách hàng trong bảng Customers.
  • Nếu tất cả các câu lệnh SQL thực hiện thành công, chúng ta commit transaction bằng cách sử dụng COMMIT, biến tất cả các thay đổi thành vĩnh viễn.
  • Nếu xảy ra bất kỳ lỗi nào hoặc nếu chúng ta quyết định loại bỏ các thay đổi, chúng ta có thể quay lại transaction bằng cách sử dụng ROLLBACK.

Lưu ý quan trọng rằng transaction được hỗ trợ bởi hầu hết các hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) như MySQL, PostgreSQL, SQL Server, Oracle, vv., và cú pháp để Begin TransactionCommit  và Rollback  transaction có thể khác nhau một chút giữa các hệ thống cơ sở dữ liệu khác nhau.

Khi nào nên sử dụng transaction?

  1. Multiple Operations as a Single Unit (Nhiều Hoạt Động là Một Đơn Vị Đơn): Khi bạn cần thực hiện nhiều hoạt động cơ sở dữ liệu (Insert, Update, Delete) mà có mối quan hệ logic và nên được xem như một đơn vị công việc duy nhất. Sử dụng transaction đảm bảo rằng hoặc tất cả các hoạt động đều thành công và được cam kết, hoặc không có hoạt động nào được thực hiện, duy trì tính toàn vẹn dữ liệu.

  2. Maintaining Data Consistency (Duy Trì Tính Nhất Quán Dữ Liệu): Trong các tình huống nơi bạn cần đảm bảo rằng cơ sở dữ liệu vẫn ở trong trạng thái nhất quán mặc dù có thể xảy ra lỗi hoặc gián đoạn trong quá trình thực hiện các hoạt động. transaction giúp duy trì tính nhất quán dữ liệu bằng cách quay trở lại các thay đổi nếu có lỗi xảy ra, ngăn chặn các cập nhật không hoàn chỉnh.

  3. Concurrency Control (Kiểm Soát Đồng Thời): Trong môi trường nhiều người dùng nơi mà nhiều người dùng có thể truy cập và sửa đổi cùng một dữ liệu đồng thời, transaction giúp quản lý đồng thời và ngăn chặn các vấn đề như mất cập nhật hoặc đọc không nhất quán bằng cách cung cấp các cơ chế như mức độ cô lập và khóa.

  4. Critical Operations (Hoạt Động Quan Trọng): Đối với các hoạt động quan trọng nơi mà bạn không thể chấp nhận các cập nhật không đầy đủ hoặc không hoàn chỉnh vào cơ sở dữ liệu. transaction cung cấp một biện pháp phòng ngừa lỗi, đảm bảo rằng các thay đổi được áp dụng hoàn toàn hoặc hoàn toàn quay trở lại.

  5. Error Handling (Xử Lý Lỗi): Sử dụng transaction giúp đơn giản hóa việc xử lý lỗi bằng cách cho phép bạn xử lý lỗi ở một cấp độ cao hơn. Thay vì phải xử lý lỗi từ các hoạt động cá nhân, bạn có thể xử lý lỗi cho toàn bộ transaction như một đơn vị duy nhất.

Tuy nhiên, cũng cần xem xét một số điều khi quyết định sử dụng transaction cho toàn bộ tập hợp các truy vấn:

  • Performance Overhead: transaction đi kèm với chi phí hiệu suất, đặc biệt là trong môi trường với lượng truy cập cao. Bao bọc một số lượng lớn các truy vấn trong một transaction có thể làm tăng thời gian khóa và ảnh hưởng đến hiệu suất tổng thể của hệ thống.

  • Transaction Management (Quản Lý transaction): Quản lý transaction hiệu quả yêu cầu kế hoạch cẩn thận và xem xét các yếu tố như ranh giới transaction, mức độ cô lập và xử lý lỗi. Sử dụng transaction không đúng cách có thể dẫn đến các vấn đề như deadlock hoặc excessive blocking (chặn quá mức).

Trường hợp sử dụng transaction

Các transaction thường được sử dụng trong các tình huống nơi bạn cần đảm bảo tính toàn vẹn và nhất quán của dữ liệu mặc dù có thể xảy ra lỗi hoặc gián đoạn trong quá trình thực hiện các hoạt động cơ sở dữ liệu. Dưới đây là một số trường hợp phổ biến mà transaction được sử dụng:

  1. Chuyển Khoản Tiền: Khi chuyển khoản tiền giữa các tài khoản trong một hệ thống ngân hàng, bạn muốn đảm bảo rằng cả hai hoạt động thu nợ và ghi nợ xảy ra. Sử dụng một transaction đảm bảo rằng hoặc cả hai hoạt động đều thành công và chuyển khoản được hoàn thành, hoặc không có hoạt động nào thành công và chuyển khoản được quay trở lại để duy trì tính nhất quán dữ liệu.

  2. Mua Sắm Trực Tuyến: Trong một hệ thống thương mại điện tử, khi một khách hàng đặt hàng, có thể xảy ra nhiều hoạt động cơ sở dữ liệu như cập nhật hàng tồn kho, tạo bản ghi đơn hàng và trừ tiền thanh toán từ tài khoản của khách hàng. Sử dụng transaction đảm bảo rằng tất cả các hoạt động này được hoàn thành thành công hoặc không có hoạt động nào được hoàn thành, để tránh các vấn đề như không nhất quán hàng tồn kho hoặc đơn hàng không hoàn chỉnh.

  3. Batch Processing: Trong các tình huống nơi nhiều hoạt động cơ sở dữ liệu cần được thực hiện như một đơn vị logic duy nhất, chẳng hạn như di chuyển dữ liệu, cập nhật hàng loạt hoặc nhập dữ liệu, transaction có thể đảm bảo rằng toàn bộ hàng loạt các hoạt động hoặc thành công hoặc thất bại cùng nhau, duy trì tính nhất quán dữ liệu.

  4. Critical Updates (Cập Nhật Quan Trọng): Khi cập nhật dữ liệu quan trọng trong cơ sở dữ liệu, chẳng hạn như thay đổi quyền của người dùng hoặc sửa đổi thông tin nhạy cảm, transaction có thể cung cấp một phương tiện bảo vệ chống lại lỗi hoặc gián đoạn, đảm bảo rằng cơ sở dữ liệu vẫn ở trong trạng thái nhất quán ngay cả khi các vấn đề xảy ra trong quá trình cập nhật.

  5. Concurrency Control (Kiểm Soát Đồng Thời): Trong môi trường nhiều người dùng nơi nhiều người dùng có thể truy cập và sửa đổi cùng một dữ liệu đồng thời, transaction giúp quản lý đồng thời và ngăn chặn các vấn đề như mất cập nhật hoặc đọc không nhất quán bằng cách cung cấp cơ chế như mức độ cô lập và khóa.

Tổng thể, các transaction được sử dụng trong các tình huống nơi bạn cần đảm bảo rằng một chuỗi các hoạt động cơ sở dữ liệu được thực hiện như một đơn vị duy nhất không thể chia nhỏ, và rằng cơ sở dữ liệu vẫn ở trong trạng thái nhất quán bất kể lỗi, gián đoạn hoặc truy cập đồng thời.

Một số điều lưu ý quan trọng khi dùng transaction

  1. Ranh giới của transaction (Transaction Boundaries): Xác định rõ ranh giới của transaction là một bước quan trọng. Đảm bảo rằng các hoạt động quan trọng và liên quan đến nhau được bao bọc bởi cùng một transaction để đảm bảo tính toàn vẹn của dữ liệu.

  2. Quản Lý Lỗi (Error Handling): Cần xác định cách xử lý lỗi trong transaction. Đảm bảo rằng nếu có lỗi xảy ra, transaction có thể được quay trở lại một cách an toàn mà không làm mất tính toàn vẹn của dữ liệu.

  3. Phân cấp và Mức độ Cô Lập (Isolation Levels): Hiểu rõ các mức độ cô lập của transaction và chọn mức độ phù hợp cho yêu cầu của ứng dụng. Các mức độ cô lập khác nhau có thể ảnh hưởng đến hiệu suất và tính nhất quán của dữ liệu.

  4. Khóa và Hiệu Suất (Locking and Performance): Sử dụng khóa một cách cẩn thận để tránh vấn đề về hiệu suất do khóa quá mức. Cân nhắc các chiến lược khóa phù hợp để giảm thiểu thời gian chờ và tối ưu hóa hiệu suất.

  5. transaction Lồng Ghép (Nested Transactions): Tránh sử dụng transaction lồng ghép một cách không cần thiết, vì điều này có thể tăng độ phức tạp của mã và gây ra các vấn đề về hiệu suất và tính nhất quán.

  6. Rủi Ro và Bảo Mật (Risk and Security): Xác định và đánh giá các rủi ro liên quan đến việc sử dụng transaction, bao gồm các vấn đề về bảo mật như quyền truy cập và kiểm soát truy cập.

  7. Đa Người Dùng và Đồng Thời (Multi-User and Concurrency): Hiểu và xử lý các vấn đề liên quan đến đa người dùng và đồng thời, bao gồm các vấn đề như mất cập nhật và đọc không nhất quán.

Tóm lại, việc sử dụng transaction đòi hỏi sự cẩn trọng và hiểu biết sâu sắc về cách làm việc của hệ thống cơ sở dữ liệu, và cần phải xem xét kỹ lưỡng để đảm bảo tính toàn vẹn và nhất quán của dữ liệu trong mọi tình huống.

Nếu bạn cũng là một tín đồ của laravel thì có tham khảo thêm thêm transaction trong Laravel và một số tính năng áp dụng của transaction nhé!

  1. Laravel transactions và các trường hợp sử dụng.
  2. Laravel Deadlock, lockForUpdate, sharedLock trong SQL transaction.
 
 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday