MySQL, MariaDB, PostgreSQL, Oracle Database và Microsoft SQL Server là những hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) phổ biến nhất hiện nay. Điểm chung của tất cả các hệ thống này là chúng đều là cơ sở dữ liệu giao dịch (transactional databases). Điều này có nghĩa là các hệ thống này cung cấp các transaction để đảm bảo tính toàn vẹn và nhất quán của dữ liệu. Vì vậy, việc hiểu rõ transaction trong database là gì và cách chúng hoạt động trong cơ sở dữ liệu quan hệ là vô cùng quan trọng.

Đọc bài viết này để hiểu rõ hơn về:

  • Transaction trong database là gì?
  • Thứ tự thực hiện transaction trong database
  • Các thao tác cơ bản với transaction

Transaction trong database là gì?

Transaction trong cơ sở dữ liệu là một đơn vị logic bao gồm một hoặc nhiều thao tác được thực hiện liên quan đến việc tạo, cập nhật hoặc truy xuất dữ liệu. Các transaction đảm bảo rằng cơ sở dữ liệu luôn ở trạng thái đáng tin cậy và nhất quán. 

Khi một transaction hoàn tất thành công, dữ liệu sẽ được cập nhật như đã chỉ định và quá trình này được gọi là “commit”. Tuy nhiên, nếu một bước nào đó trong transaction gặp lỗi, tất cả các bước trước đó sẽ bị hủy bỏ và dữ liệu sẽ được hoàn nguyên về trạng thái ban đầu giống như trước khi thực hiện các hành động trong transaction. Quá trình này được gọi là “rollback”.

Một transaction trong CSDL kết thúc bằng việc commit hoặc rollback, đảm bảo rằng dữ liệu luôn tuân thủ theo các thuộc tính ACID, bao gồm: Atomicity (tính nguyên tử), Consistency (tính nhất quán), Isolation (tính độc lập) và Durability (tính bền vững). Đây là những nguyên tắc quan trọng để đảm bảo sự an toàn và ổn định cho dữ liệu trong quá trình xử lý giao dịch.

Tính chất ACID của transaction

Trong hệ quản trị cơ sở dữ liệu (DBMS), các transaction phải tuân theo bốn tính chất ACID để đảm bảo tính toàn vẹn của dữ liệu trong trường hợp có lỗi hoặc sự cố xảy ra. Cụ thể, ACID bao gồm các tính chất sau:

  1. Atomicity (Tính nguyên tử): Tính chất này đảm bảo rằng tất cả các thao tác trong một transaction phải được thực hiện hoàn toàn, hoặc không thực hiện gì cả. Điều này có nghĩa là transaction là một đơn vị không thể chia nhỏ. Nếu có bất kỳ thao tác nào thất bại, toàn bộ transaction sẽ bị hủy và các thay đổi trước đó sẽ bị rollback để ngăn chặn việc cập nhật không hoàn chỉnh lên cơ sở dữ liệu.
  2. Consistency (Tính nhất quán): Bất kỳ transaction nào cũng phải đảm bảo rằng sau khi hoàn thành, cơ sở dữ liệu vẫn ở trạng thái nhất quán theo các quy tắc và ràng buộc hiện có trong CSDL (khóa chính, khóa ngoại, unique,..). Nếu cơ sở dữ liệu ở trạng thái nhất quán trước khi transaction diễn ra, nó phải tiếp tục ở trạng thái nhất quán sau khi transaction hoàn tất, bất kể transaction thành công hay thất bại.
  3. Isolation (Tính cô lập): Tính chất này đảm bảo rằng mỗi transaction được thực hiện như thể nó là transaction duy nhất đang chạy trên hệ thống. Dữ liệu được sử dụng trong một transaction chưa hoàn thành sẽ không bị thay đổi bởi các transaction khác. Mặc khác, dữ liệu đã được thay đổi trong transaction nhưng chưa commit sẽ không được hiển thị ở các lệnh truy vấn khác. Điều này ngăn ngừa các xung đột khi có nhiều transaction đồng thời thao tác trên cùng một dữ liệu.
  4. Durability (Tính bền vững): Sau khi một transaction hoàn tất và được commit, các thay đổi của nó sẽ được lưu vĩnh viễn vào cơ sở dữ liệu, ngay cả khi có sự cố hệ thống xảy ra sau đó. Nếu cơ sở dữ liệu bị lỗi sau khi transaction hoàn thành nhưng trước khi dữ liệu được ghi lên đĩa, hệ thống sẽ đảm bảo rằng các thay đổi của transaction vẫn được áp dụng khi hệ thống trở lại hoạt động.

Mặc dù ACID giúp đảm bảo tính toàn vẹn và an toàn của dữ liệu, việc đảm bảo các tính chất này thường đi kèm với một cái giá về hiệu suất. Một số DBMS như MySQL cho phép vô hiệu hóa một phần tính chất ACID để cải thiện tốc độ bằng cách điều chỉnh một số thông số hệ thống thông qua việc điều chỉnh các tham số hệ thống (ví dụ như tắt chế độ autocommit hoặc ghi nhật ký giao dịch).

Tại sao database transaction lại cần thiết?

Hệ thống có thể gặp sự cố bất ngờ như mất điện, lỗi phần mềm, lỗi phần cứng hoặc các lỗi xảy ra khi các thao tác ghi, cập nhật dữ liệu trong những tình huống này, transaction đảm bảo rằng kết quả của dữ liệu vẫn đáng tin cậy và nhất quán. Điều này có nghĩa là trạng thái của cơ sở dữ liệu sẽ phản ánh tất cả các thay đổi được commit trước thời điểm xảy ra sự cố và những transaction đang thực hiện tại thời điểm đó sẽ được rollback sạch sẽ để tránh sai sót.

Khi có nhiều yêu cầu đồng thời tác động lên máy chủ cơ sở dữ liệu và thao tác trên cùng một dữ liệu, transaction sẽ cô lập các yêu cầu này với nhau để tránh xung đột. Điều này đảm bảo rằng các thay đổi được thực hiện độc lập và không gây ảnh hưởng lẫn nhau, giúp duy trì tính toàn vẹn của dữ liệu.

Vòng đời của một transaction trong database

Vòng đời của một transaction trong cơ sở dữ liệu giao dịch (transactional database) trải qua từ khi bắt đầu đến khi kết thúc qua các bước như sau:

  1. Transaction bắt đầu: Hệ thống cơ sở dữ liệu chuẩn bị mọi thứ cần thiết để thực hiện transaction.
  2. Thực thi các truy vấn trong transaction: Đây là giai đoạn thao tác dữ liệu, bao gồm việc đọc và ghi. Dữ liệu sẽ được lưu trữ tạm thời trong bộ nhớ và chưa commit vào CSDL.
  3. Transaction được commit nếu không có lỗi xảy ra: Nếu tất cả các thao tác được thực hiện thành công, transaction sẽ được kết thúc với việc commit, tức là các thay đổi trở nên vĩnh viễn trong cơ sở dữ liệu và không thể quay lại.
  4. Transaction rollback nếu xảy ra lỗi: Nếu có lỗi trong quá trình thực hiện, tất cả các thay đổi trước đó sẽ bị hủy bỏ và dữ liệu được trả về trạng thái ban đầu trước khi transaction bắt đầu.

Các trạng thái của transaction trong database

Transaction trong cơ sở dữ liệu trải qua nhiều trạng thái trong suốt vòng đời của nó để đảm bảo dữ liệu được xử lý an toàn và nhất quán. Quá trình hoạt động của một transaction thường bao gồm các trạng thái sau:

  1. Trạng thái hoạt động (Active): Đây là trạng thái đầu tiên khi một transaction bước vào giai đoạn Begin Transaction. Lúc này transaction sẵn sàng để thực hiện các lệnh như đọc hoặc ghi dữ liệu. Transaction ở trạng thái này cho đến khi hoàn tất các thao tác.
  2. Trạng thái một phần được commit (Partially Committed): Trong trạng thái này, các thay đổi đã được thực hiện nhưng chỉ được lưu trữ trong  bộ nhớ tạm thời và chưa được ghi vào cơ sở dữ liệu một cách vĩnh viễn.
  3. Trạng thái đã commit (Committed): Tại thời điểm này, tất cả các cập nhật của transaction đã được lưu trữ vĩnh viễn vào cơ sở dữ liệu. Sau khi transaction được commit, không thể thực hiện rollback để quay lại trạng thái trước đó.
  4. Trạng thái thất bại (Failed): Nếu transaction gặp lỗi hoặc bị hủy trong trạng thái hoạt động hoặc một phần được commit, nó sẽ chuyển sang trạng thái thất bại. Khi đó, hệ thống sẽ thực hiện rollback để đảm bảo dữ liệu trở về trạng thái ban đầu, như thể transaction chưa từng được thực hiện.
  5. Trạng thái kết thúc (Terminated): Đây là trạng thái cuối cùng sau khi transaction được commit hoặc bị rollback. Trạng thái này đánh dấu kết thúc vòng đời của transaction.

Với những trạng thái này, transaction đảm bảo rằng dữ liệu luôn chính xác và không bị lỗi ngay cả khi hệ thống gặp sự cố, đồng thời ngăn chặn xung đột khi có nhiều yêu cầu đồng thời thay đổi dữ liệu cùng một lúc. 

Thứ tự thực hiện transaction trong database 

Khi nhiều transaction được yêu cầu thực hiện đồng thời trong cơ sở dữ liệu, thứ tự thực hiện các transaction rất quan trọng để đảm bảo tính nhất quán và an toàn của dữ liệu. Có hai loại thứ tự thực hiện transaction chính:

Thứ tự thực hiện tuần tự (Serial Schedule)

Trong loại thứ tự này, các transaction được thực hiện lần lượt, nghĩa là chỉ có một transaction được thực hiện tại một thời điểm. Khi một transaction kết thúc hoàn toàn, transaction tiếp theo mới bắt đầu.

Điều này đảm bảo tính nhất quán cho cơ sở dữ liệu vì các transaction không can thiệp vào nhau.

Tuy nhiên, việc thực hiện tuần tự này làm tăng thời gian chờ của các transaction và giảm hiệu suất hệ thống (số lượng transaction được xử lý trong một khoảng thời gian nhất định bị hạn chế), điều này không phù hợp với các hệ thống lớn.

Thứ tự thực hiện không tuần tự (Non-Serial Schedule)

Để tăng hiệu quả của hệ thống, thứ tự không tuần tự cho phép nhiều transaction có thể bắt đầu và thực thi song song, trước khi transaction đầu tiên hoàn thành. Điều này giúp giảm thời gian chờ và tăng thông lượng (throughput) của hệ thống.

Tuy nhiên, nếu không được kiểm soát cẩn thận, việc thực thi không tuần tự có thể dẫn đến lỗi hoặc tình trạng không nhất quán trong cơ sở dữ liệu. Để xử lý điều này, các thuật toán đặc biệt như Two-Phase Locking, Timestamp Ordering, Serializable Schedule được sử dụng để đảm bảo tính nhất quán dữ liệu ngay cả khi các transaction thực hiện đồng thời.

Nhìn chung, trong môi trường xử lý đồng thời, việc chọn loại thứ tự thực hiện phụ thuộc vào yêu cầu về hiệu suất và tính nhất quán của hệ thống. Các giao dịch tuần tự được coi là chuẩn mực để so sánh và đánh giá, nhưng giao dịch không tuần tự nếu được quản lý đúng cách, sẽ giúp hệ thống hoạt động hiệu quả hơn mà vẫn duy trì được tính nhất quán của dữ liệu.

Các thao tác cơ bản với transaction trong database

Trong quá trình thực hiện transaction, có bốn thao tác cơ bản để truy cập và thay đổi nội dung của cơ sở dữ liệu. Các thao tác này đảm bảo rằng dữ liệu được xử lý một cách an toàn và nhất quán

Read(X)

Thao tác đọc giá trị của X từ cơ sở dữ liệu và lưu trữ nó trong bộ nhớ đệm (buffer) của bộ nhớ chính để thực hiện các hành động khác, chẳng hạn như hiển thị giá trị này. Thao tác đọc thường được sử dụng khi người dùng chỉ muốn xem nội dung mà không thay đổi nó.

Ví dụ: Khi người dùng kiểm tra số dư tài khoản ngân hàng của mình, hệ thống sẽ thực hiện thao tác Read(X) để lấy giá trị số dư từ cơ sở dữ liệu và hiển thị cho người dùng. Ví dụ để lấy thông tin số dư từ tài khoản của một người dùng, ta sử dụng cú pháp như sau:

SELECT balance FROM accounts WHERE account_id = '12345';

Write(X)

Thao tác ghi giá trị từ bộ nhớ đệm trở lại cơ sở dữ liệu sau khi giá trị này đã được thay đổi. Để thực hiện thao tác ghi, trước tiên hệ thống sẽ đọc giá trị X vào bộ nhớ đệm thông qua thao tác Read(X), sau đó thực hiện các thay đổi (như tính toán) và cuối cùng lưu lại kết quả vào cơ sở dữ liệu.

Ví dụ: Khi người dùng rút tiền từ tài khoản, số dư của tài khoản sẽ được đọc từ cơ sở dữ liệu, sau đó số tiền rút sẽ được trừ khỏi số dư và cuối cùng, giá trị số dư mới sẽ được lưu lại trong cơ sở dữ liệu thông qua thao tác Write(X). Ví dụ để cập nhật số dư tài khoản sau khi người dùng thực hiện rút tiền, ta sử dụng cú pháp như sau:

UPDATE accounts SET balance = balance - 100 WHERE account_id = '12345';

Insert(X)

Insert được sử dụng để thêm một bản ghi mới vào bảng, giúp mở rộng dữ liệu trong cơ sở dữ liệu.

Ví dụ: Khi người dùng tạo tài khoản mới, hệ thống sẽ thực hiện thao tác Insert để thêm bản ghi mới với thông tin tài khoản vào cơ sở dữ liệu.

INSERT INTO accounts (account_id, balance) VALUES ('12345', 500);

Delete(X)

Delete được sử dụng để loại bỏ dữ liệu không còn cần thiết hoặc không hợp lệ, đảm bảo dữ liệu trong cơ sở dữ liệu luôn chính xác và không dư thừa.

Ví dụ: Khi người dùng đóng tài khoản, thao tác Delete sẽ được thực thi để xóa bản ghi liên quan đến tài khoản đó khỏi cơ sở dữ liệu với cú pháp như sau:

DELETE FROM accounts WHERE account_id = '12345'; 

Commit

Thao tác này được sử dụng để xác nhận các thay đổi đã thực hiện bởi transaction. Khi một transaction hoàn tất mà không gặp lỗi, thao tác Commit sẽ lưu vĩnh viễn các thay đổi vào cơ sở dữ liệu. Điều này giúp đảm bảo tính toàn vẹn của dữ liệu, tránh sự không nhất quán do sự cố như mất điện hoặc hỏng phần cứng.

Ví dụ: Sau khi người dùng thực hiện giao dịch chuyển tiền, thao tác Commit sẽ được thực hiện để đảm bảo số tiền đã được trừ từ tài khoản của người gửi và cộng vào tài khoản của người nhận với cú pháp sau:

COMMIT;

Rollback

Thao tác này được thực hiện khi có sự cố xảy ra trong quá trình thực hiện transaction (ví dụ: mất điện, lỗi phần cứng). Rollback sẽ đưa cơ sở dữ liệu trở lại trạng thái trước khi transaction bắt đầu, nhằm đảm bảo tính an toàn và nhất quán cho dữ liệu.

Ví dụ: Nếu hệ thống gặp sự cố trong khi người dùng đang thực hiện giao dịch chuyển tiền, thao tác Rollback sẽ hủy bỏ mọi thay đổi trước đó và đưa số dư tài khoản trở về trạng thái ban đầu, như thể giao dịch chưa bao giờ được thực hiện với cú pháp sau:

ROLLBACK;

Ưu điểm của transaction trong quản lý dữ liệu

Transaction trong cơ sở dữ liệu mang lại nhiều lợi ích quan trọng trong việc quản lý dữ liệu, đặc biệt là trong các hệ thống yêu cầu tính toàn vẹn và bảo mật cao. Dưới đây là những ưu điểm nổi bật:

  • Đảm bảo tính toàn vẹn của dữ liệu: Transaction được thiết kế tuân thủ các thuộc tính ACID, đảm bảo rằng mọi thao tác trên dữ liệu đều phải hoàn thành thành công hoặc hoàn toàn không thực hiện, tránh tình trạng dữ liệu bị thay đổi một phần. Điều này rất quan trọng trong các ứng dụng như hệ thống ngân hàng, nơi mà các giao dịch tài chính phải đảm bảo toàn bộ hoặc không thay đổi gì.
  • Xử lý lỗi hiệu quả: Khi có lỗi xảy ra trong quá trình thực hiện transaction, cơ chế rollback cho phép hoàn tác mọi thay đổi đã thực hiện, giúp hệ thống trở lại trạng thái an toàn trước khi lỗi xảy ra. Điều này giúp đảm bảo dữ liệu luôn nhất quán và tránh tình trạng không chắc chắn.
  • Cải thiện hiệu suất với thao tác đồng thời: Transaction cho phép nhiều thao tác có thể được thực hiện đồng thời mà không làm ảnh hưởng đến tính nhất quán của dữ liệu. Điều này giúp tăng hiệu suất hệ thống, đặc biệt trong các môi trường có nhiều người dùng hoặc yêu cầu truy cập dữ liệu liên tục như các trang thương mại điện tử, hệ thống đặt vé máy bay.
  • Giảm thiểu sai sót do lỗi người dùng: Transaction cho phép kiểm tra lỗi và hoàn tác các thao tác sai lầm bằng lệnh rollback, giúp hệ thống có thể tự động khôi phục trạng thái an toàn khi xảy ra các thao tác sai, từ đó giảm thiểu rủi ro do lỗi người dùng và đảm bảo tính nhất quán của dữ liệu. 

Vì vậy transaction rất hữu ích trong các hệ thống cần bảo toàn tính toàn vẹn của dữ liệu như hệ thống tài chính, ngân hàng, quản lý đặt phòng khách sạn, đặt vé máy bay và các trang thương mại điện tử. Các giao dịch này cần đảm bảo rằng mọi thay đổi phải được thực hiện toàn diện, giúp hệ thống duy trì tính toàn vẹn và hiệu suất, ngay cả trong những tình huống phức tạp và có lỗi xảy ra.

Câu hỏi thường gặp về transaction trong database

Cách phân biệt transaction và query là gì?

Query là một thao tác đơn lẻ thực hiện các hành động CRUD (Create, Read, Update, Delete) trên dữ liệu trong một bảng. Ví dụ, một query có thể là một lệnh để đọc dữ liệu từ cơ sở dữ liệu hoặc cập nhật một giá trị cụ thể.

Ngược lại, transaction là một khối hành động bao gồm một hoặc nhiều lệnh, query và các thao tác khác nhau được thực hiện như một đơn vị không thể chia nhỏ. Transaction đảm bảo rằng tất cả các thao tác bên trong nó phải hoàn thành thành công hoặc không được thực hiện gì cả, đảm bảo tính toàn vẹn của dữ liệu.

NoSQL có hỗ trợ transaction không?

Một số công nghệ NoSQL cũng hỗ trợ transaction mặc dù transaction thường gắn liền với các cơ sở dữ liệu quan hệ, nhưng một số cơ sở dữ liệu NoSQL như FoundationDB, MarkLogic và Oracle NoSQL cũng hỗ trợ các transaction để đảm bảo tính toàn vẹn của dữ liệu.

Đọc thêm: NoSQL là gì? Vì sao gọi NoSQL là bước tiến mới trong quản lý dữ liệu?

Một transaction trong cơ sở dữ liệu có thể ảnh hưởng đến hiệu suất không?

Mặc dù transaction đảm bảo tính nhất quán và bền vững của dữ liệu, nhưng chúng cũng có thể làm chậm hiệu suất hệ thống, đặc biệt là trong các hệ thống có khối lượng giao dịch cao.

Tổng kết transaction trong database

Transaction trong database đóng vai trò thiết yếu trong việc quản lý dữ liệu, đảm bảo rằng mọi thao tác được thực hiện chính xác và nhất quán. Nhờ các tính chất ACID, transaction giúp duy trì tính toàn vẹn của cơ sở dữ liệu ngay cả khi xảy ra sự cố. Transaction không chỉ giúp tối ưu hóa hiệu suất hệ thống mà còn đảm bảo sự an toàn và đáng tin cậy của dữ liệu trong các ứng dụng thực tế.

ITviec hy vọng bài viết trên đã giúp bạn có cái nhìn chi tiết hơn về transaction và khả năng ứng dụng trong các ứng dụng thực tế.