Ở bài trước chúng ta đã tìm hiểu về các câu lệnh DML, là các thao tác thêm xóa sửa dữ liệu trong database. Để đảm bảo tính nhất quán, tính toàn vẹn cơ sở dữ liệu, các thao tác này được tổ chức và kiểm soát bằng database transaction

 

Transaction là tập hợp bao gồm 1 hay nhiều câu lệnh DML, tác động thay đổi lên dữ liệu.

 

Các transaction phải được đảm bảo tính chất ACID:

  • Atomicity: tính nguyên tử. Mỗi transaction phải là 1 đơn vị thống nhất, tất cả các câu lệnh thành công -> transaction hoàn thành, chỉ cần 1 câu lệnh bị lỗi -> transaction bị hủy bỏ
  • Consistency: tính toàn vẹn. Transaction phải đảm bảo thay đổi database đúng đắn, không được vi phạm các quy luật, các ràng buộc trong database (chẳng hạn về data type, constraint..)
  • Isolation: tính độc lập. Mỗi transaction thực thi tách biệt với transaction khác, không dẫm chân lên nhau trong việc xử lý dữ liệu
  • Durability: tính bền vững. Dữ liệu sau khi được transaction thay đổi và xác nhận lưu lại phải được đảm bảo tồn tại trong database

 

VD: chuyển tiền từ tài khoản A sang tài khoản B trong 1 ngân hàng. Giao dịch bao gồm 2 thao tác: trừ tiền trong tài khoản A, cộng tiền vào tài khoản B. Giao dịch chỉ thành công khi cả 2 thao tác trên được thực hiện.

 

Trong Oracle database, 1 transaction bắt đầu khi có 1 câu lệnh DML, và kết thúc khi 1 trong các điều kiện sau xảy ra:

  • Xác nhận lưu lại bằng lệnh Commit, hoặc hủy bỏ bằng lệnh Rollback
  • 1 thao tác DDL xảy ra (ví dụ CREATE TABLE)
  • User thoát khỏi ứng dụng
  • Hệ thống bị lỗi (ví dụ system crash)

Commit & Rollback

Đây là 2 câu lệnh điều khiển (DCLData Control Language), có tác dụng lưu lại (Commit) hoặc hủy bỏ (Rollback) transaction. Khi xử lý dữ liệu, ta cần nhớ rõ việc sử dụng 2 câu lệnh này.

 

 

 

Ngoài ra, Oracle còn hỗ trợ lệnh SAVEPOINT savepointnameROLLBACK TO savepointname để rollback từng phần trong 1 transaction. Khi commit Oracle sẽ xác nhận toàn bộ những thay đổi trong transaction cho tới thời điểm commit. 

 

 

Nếu trong quá trình thực hiện transaction, có 1 câu lệnh bị lỗi, chỉ câu lệnh đó bị rollback, những thay đổi khác vẫn còn nguyên, Oracle mặc định savepoint cho chúng ta. Ta cần Rollback hoặc Commit tường minh để xác nhận hoặc hủy bỏ thay đổi dữ liệu.

 

 

Implicit commit

Thao tác commit ngầm định xảy ra khi có 1 câu lệnh DDL được thực hiện, hoặc user thoát khỏi chương trình 1 cách bình thường, trước khi có lệnh Commit hay Rollback.

 

 

 

Implicit commit được thực hiện trước và sau câu lệnh DDL. Do đó câu lệnh DDL thành công hay thất bại thì transaction trước đó đều được Commit.

 

Implicit rollback

Thao tác rollback ngầm định xảy ra khi ứng dụng hoặc hệ thống bị lỗi, trước khi transaction được Commit hay Rollback.

 

 

Đặc tính dữ liệu khi đang thực hiện transaction

  • Dữ liệu có thể trả về trạng thái cũ bằng lệnh Rollback
  • Chỉ có user thực hiện mới thấy dữ liệu thay đổi trong session hiện tại (dùng lệnh SELECT)
  • User khác không thấy được các dữ liệu thay đổi
  • Các dòng dữ liệu đang xử lý sẽ bị lock, các user khác không thao tác thay đổi được

 

Đặc tính dữ liệu sau khi commit

  • Dữ liệu mới được lưu vào database, các dữ liệu cũ được cập nhật lại
  • Tất cả các user thấy được dữ liệu mới
  • Lock được release, cho phép các user khác giành quyền thao tác
  • Các savepoint được xóa

 

Đặc tính dữ liệu sau khi rollback

  • Dữ liệu được trả về trạng thái ban đầu trước khi thao tác
  • Lock được release, cho phép các user khác giành quyền thao tác

Trong thực tế, cần chú ý sử dụng lệnh Commit phù hợp để đảm bảo những thay đổi dữ liệu của chúng ta được lưu lại chính xác.