Tôi cá rằng cơ sở dữ liệu của bạn đang chạy RAC (Cụm ứng dụng thực). Giả sử đó là trường hợp và bạn tạo chuỗi với tất cả các cài đặt mặc định, đó là hành vi được mong đợi.
Cài đặt mặc định là lưu vào bộ đệm 20 giá trị. Theo mặc định, mỗi nút trong cụm RAC sẽ có một bộ đệm riêng. Giả sử rằng bạn có một cụm với hai nút A và B, lần đầu tiên một nextval
được yêu cầu trên A, A sẽ lưu vào bộ nhớ cache các giá trị 1-20 và trả về giá trị 1. Nếu yêu cầu tiếp theo cho một nextval
được thực hiện trên B, B sẽ lưu vào bộ nhớ cache các giá trị 21-40 và trả về giá trị 21. Từ đó, giá trị bạn nhận được sẽ phụ thuộc vào nút mà kết nối của bạn đang chạy.
Nói chung, đây không phải là một vấn đề. Chuỗi tạo ra các số duy nhất. Các số thường không cần liên tiếp. Nếu bạn thực sự cần các giá trị được trả về tuần tự vì bạn đang làm một việc gì đó như sắp xếp thứ tự theo giá trị do trình tự tạo để xác định hàng "đầu tiên" hoặc "cuối cùng", bạn có thể sử dụng ORDER
khi bạn tạo chuỗi để buộc các giá trị được trả về theo thứ tự. Tuy nhiên, điều đó có hàm ý tiêu cực về hiệu suất trong cơ sở dữ liệu RAC, vì nó làm tăng lượng giao tiếp cần phải tiếp tục giữa các nút để đồng bộ hóa các giá trị được trả về. Nếu bạn cần xác định hàng "đầu tiên" hoặc "cuối cùng", nói chung tốt hơn là thêm date
hoặc timestamp
vào bảng và sắp xếp theo thứ tự thay vì giả định rằng khóa chính được tạo tuần tự.