Ở phần trước, ta đã biết được tính năng Flashback version query có thể liệt kê lại những thay đổi trên dữ liệu. Từ đó ta có thể khôi phục lại dữ liệu cũ nếu muốn.

 

Tuy vậy, chẳng hạn trong trường hợp xóa dữ liệu, ngồi viết lại câu insert cũng … mất công, hoặc trường hợp xóa 1 row trong bảng chính, có cascade, dữ liệu các bảng con cũng bị xóa theo, việc khôi phục sẽ khó khăn hơn nhiều.

 

Do đó, Oracle cung cấp tính năng Flashback transaction, với khả năng hỗ trợ mạnh mẽ hơn trong việc khôi phục dữ liệu bị thay đổi từ các transaction.

 

Để sử dụng tính năng này, ta cần bật supplemental logging để ghi thêm dữ liệu hoạt động trong database:

 

 

Để cấp quyền cho user sử dụng tính năng này, ta cấp các quyền sau:

 

 

Ta thử xóa 1 dòng và update 1 dòng khác

 

 

Kiểm tra thử bằng Flashback version query

 

 

flashback_transaction_1

 

Thay vì ngồi viết lại câu insert khôi phục dòng đã xóa, hay sửa lại dòng bị update, ta có thể query trong Flashback transaction table để lấy câu lệnh Undo nhanh gọn lẹ

 

 

Kết quả

 

flashback_transaction_2

 

Thực ra trong table flashback_transaction_query còn có cột XID, và Undo_change#. Khi query thêm 2 column này, ta sẽ biết các thao tác trong cùng 1 transaction, và thứ tự thao tác, để thực hiện Undo cho chính xác. 

 

Ví dụ với transaction trên, ta thực hiện delete trước, update sau. Khi rollback, ta thấy thứ tự undo_change# sẽ ngược lại, là undo update trước, undo delete sau.

 

 

Sử dụng 2 câu SQL trong cột UNDO_SQL và thứ tự UNDO_CHANGE#, ta có thể khôi phục lại dữ liệu dễ dàng:

 

 

Ngoài cách rollback bằng tay, Oracle có cung cấp 1 package hỗ trợ là DBMS_FLASHBACK.

 

Tuy nhiên hiện tại ở version 11.2.0.4, khi thử sử dụng package này để rollback transaction, mình vẫn không thể thực hiện được, dù chỉ rollback 1 transaction đơn giản như update 1 row, hay transaction có khóa ngoại dính tới 2 table chẳng hạn, cũng đều gặp lỗi. Do đó, hiện tại nếu sử dụng tính năng này, chúng ta đành phải rollback thủ công vậy.