Khoảng trống xuất hiện nếu giao dịch sử dụng số thứ tự nhưng sau đó được cuộn lại.
Có thể câu trả lời không phải là chỉ định số hóa đơn cho đến khi không thể cuộn lại hóa đơn. Điều này giảm thiểu (nhưng có lẽ không loại bỏ) khả năng của những khoảng trống.
Tôi không chắc chắn rằng có bất kỳ cách nhanh chóng hoặc dễ dàng nào để đảm bảo không có khoảng trống trong chuỗi - quét MAX, thêm một và chèn vào đó có lẽ là gần nhất để bảo mật, nhưng không được khuyến nghị vì lý do hiệu suất (và khó khăn với đồng thời) và kỹ thuật sẽ không phát hiện nếu số hóa đơn mới nhất được gán, sau đó bị xóa và được chỉ định lại.
Bạn có thể giải thích các khoảng trống bằng cách nào đó - bằng cách xác định số hóa đơn nào đã 'sử dụng' nhưng 'không được thực hiện vĩnh viễn' bằng cách nào đó? Có thể một giao dịch tự quản giúp đỡ trong việc đó không?
Một khả năng khác - giả định khoảng trống tương đối ít và xa.
Tạo bảng ghi lại số thứ tự phải được sử dụng lại trước khi một giá trị chuỗi mới được lấy. Thông thường, nó sẽ trống rỗng, nhưng một số quá trình chạy mỗi ... phút, giờ, ngày ... kiểm tra các khoảng trống và chèn các giá trị bị nhỡ vào bảng này. Tất cả các quy trình đầu tiên kiểm tra bảng các giá trị bị mất và nếu có bất kỳ giá trị nào, hãy sử dụng giá trị từ đó, thực hiện quá trình cập nhật chậm và xóa hàng mà chúng sử dụng. Nếu bảng trống, sau đó lấy số thứ tự tiếp theo.
Không dễ chịu lắm, nhưng việc tách 'số hóa đơn' từ 'quét các giá trị bị bỏ lỡ' có nghĩa là ngay cả khi quá trình lập hóa đơn không thành công cho một số chuỗi khi sử dụng một trong các giá trị bị thiếu, giá trị đó sẽ được tái khám phá bị thiếu và tái phát hành lần sau - lặp lại cho đến khi một số quy trình thành công với nó.
Nguồn
2009-12-31 17:29:10
Bạn đã thử tùy chọn 'NOCACHE' ngón chân trên 'CREATE SEQUENCE' chưa? Điều đó sẽ loại bỏ những khoảng trống. – skaffman
@skaffman: Không, 'NOCACHE' chỉ định số lượng giá trị chuỗi sẽ được lưu trữ trong bộ nhớ để truy cập nhanh hơn: http://www.techonthenet.com/oracle/sequences.php –