Việc xử lý hàm Current_Date trong các truy vấn trở nên phức tạp hơn bởi người sử dụng được phép chèn dữ liệu với thuộc tính có giá trị thời gian trong tương lai. Có hai phương pháp để sử dụng Current_Date trong truy vấn.
- Thứ nhất là chúng ta có thể sử dụng cùng một giá trị trong toàn bộ giao tác, ví dụ như thời gian khi một giá trị của Curent_Date là đầu tiên cần đến.
- Thứ hai là chúng ta có thể cho phép sử dụng các giá trị khác nhau cho
Current_Date trong các truy vấn khác nhau trong cùng một giao tác, mà có thể đạt được chỉ đơn giản bằng cách để lại lời gọi của Current_Date như là trong các truy vấn.
3.3.2.1. Sử dụng một giá trị duy nhất cho Current_Date
Khi sử dụng một giá trị duy nhất cho Current_Date trong các truy vấn, chúng ta không thể sử dụng giá trị tương tự như đối với sự thay đổi mà chúng ta đã tìm hiểu trong mục 3.3.1, bởi vì thời gian sử dụng là thời gian commit mà trong truy vấn chúng ta chưa biết đến khi giao tác thực sự commit. Thay vào đó, giả sử chúng ta sử dụng thời gian khi Current_Date là đầu tiên cần đến, có thể được xác định cú pháp và xem xét các giao tác trong hình 3.4 dưới đây:
Hình 3.4. Current_Date trong truy vấn
Như trên hình, giao tác sẽ bắt đầu vào ngày 16/1 và commit vào ngày 22/1. CSDL bao gồm một bộ dữ liệu nhân viên “Mi”có lương 28000 trong giai đoạn [1998/01/14 - 1998/01/19).
- Bây giờ giả sử có truy vấn Q1 thực hiện vào ngày 18/1, yêu cầu hiển thị tất cả các nhân viên hiện tại có lương 30000. Truy vấn Q1 phải sử dụng một giá trị cho Curent_Date và đây là thời gian mà đầu tiên cần đến, vì thế
Current_Date sẽ được khởi tạo vào ngày 18/1.
- Trong ngày 20/1, truy vấn Q2 yêu cầu hiển thị tất cả các nhân viên hiện tại có lương 28000. Bởi vì chúng ta chỉ sử dụng một giá trị cho Current_Date
trong một giao tác, nên chúng trả kết quả là ngày 16/1 và Q2 sẽ trả lại kết quả là nhân viên “Mi” có lương là 28000. Mặc dù các truy vấn được thực hiện vào ngày 20/1 và chúng ta đã ghi nhận có nhân viên “Mi” với lương là 28000 trong khoảng thời gian [1998/01/14 - 1998/01/19).
3.3.2.2. Sử dụng nhiều giá trị thay thế cho Current_Date
Tiếp theo, chúng ta xem xét việc sử dụng nhiều giá trị thay thế cho
Current_Date trong truy vấn trong một giao tác. Đối với mỗi câu lệnh trong 1 truy vấn chúng ta lưu giữ giá trị Current_Date, với mỗi lời gọi có thể cho ra một giá trị khác nhau. (Mi, 28000) 10 11 12 13 14 15 16 17 18 19 20 21 22 23 18 Q1 Q2 Thời gian 20
Ta quay lại hình 3.4 ở mục trên, cách tiếp cận này cho thấy Current_Date
sẽ có 2 giá trị là ngày 18/1 và ngày 20/1 trong các truy vấn Q1 và Q2 tương ứng. Điều này cũng phát sinh một vấn đề đó là những câu truy vấn tương tự nhau, để rõ vấn đề này ta xét ví dụ sau:
Ví dụ 3.2. Như hình 3.4 truy vấn Q1 thực hiện ngày 18/1, truy vấn Q2 thực hiện ngày 20/1 nếu hai truy vấn Q1 và Q2 là truy vấn tương tự nhau. Giả sử như cả hai truy vấn đều lấy tất cả các bộ dữ liệu của nhân viên có lương 28000.
- Vì truy vấn Q1 thực hiện trước vào ngày 18/1 nên kết quả sẽ trả về là thông tin nhân viên “Mi”có lương 28000.
- Đến ngày 20/1 truy vấn Q2 thực hiện nhưng sẽ không có nhân viên nào có lương là 28000 được trả về nữa.
Sự biến mất của bộ dữ liệu ghi nhân viên “Mi” với lương 28000 để không lặp lại vấn đề và hình thành một vi phạm tính độc lập của giao tác. Không lặp lại việc đọc là một vấn đề mà nhiều người sử dụng trong các hệ thống CSDL thông thường.