Trình tự đang sử dụng lại


11

Tôi có một chuỗi tạo số theo dõi cho các đối tượng trong hệ thống của mình. Nó đã hoạt động tốt trong một thời gian.

Tuần trước chúng tôi nhận thấy rằng nó đã bắt đầu sử dụng lại các giá trị.

Điều dường như xảy ra là tại các thời điểm khác nhau vào buổi tối, nó sẽ quay trở lại giá trị mà nó có được vào ngày hôm trước. Sau đó nó sẽ tiếp tục tạo ra các giá trị từ thời điểm đó.

Vì vậy, ví dụ tôi có thể nhận được một cái gì đó như thế này:

10.112
10113
10.114
10115
10.116
10117
10.118
10113
10.114
10115
10.116
...

Dường như không có bất kỳ mô hình nào xảy ra khi nó xảy ra, thời lượng giữa lần sử dụng đầu tiên và lần sử dụng thứ hai (chỉ trong 10 phút hoặc vài giờ) hoặc bao nhiêu lần được khôi phục (ít nhất là 1 và vài trăm).

Tôi đã nghĩ về việc chạy một dấu vết (và vẫn có thể), nhưng tôi không nghĩ rằng đối tượng chuỗi đang được sửa đổi trực tiếp. Lý do tôi tin rằng đây là ngày sửa đổi đã vài ngày tuổi và chỉ ra thời điểm chúng tôi tự nâng giá trị lên để thử và loại bỏ trùng lặp. (Và vấn đề đã xảy ra nhiều lần kể từ đó.)

Có ai có ý tưởng về những gì có thể gây ra một chuỗi rollback và tái sử dụng các giá trị mỗi đêm không?

CẬP NHẬT: Để trả lời một vài câu hỏi trong các ý kiến:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) ngày 19 tháng 10 năm 2012 13:38:57

  • Tạo tập lệnh:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
  • Tôi không có một ràng buộc duy nhất (nhưng tôi dự định sẽ đưa nó vào). Tuy nhiên, điều đó sẽ chỉ giúp tôi biết khi tôi đã sử dụng lại một giá trị. Không phải những gì gây ra các giá trị để thiết lập lại. Tôi đặt một công việc vào đó sẽ nhận được một giá trị mới cứ sau 5 phút và lưu nó lại. Thời gian và giá trị nhảy không theo một mô hình.

  • Tôi đã kiểm tra Nhật ký sự kiện để xem có lỗi không. Suy nghĩ duy nhất đang xảy ra là thế này: http://support.microsoft.com/kb/2793634 Chúng tôi đang áp dụng bản sửa lỗi ngày hôm nay. Tôi không nghĩ rằng những điều này có liên quan, nhưng nó có thể.

1
Tại sao không có ràng buộc PK hoặc Unique trên cột này? Với điều đó, việc tái sử dụng này sẽ bị bắt và bạn không cần phải đoán nó đến từ đâu, trừ khi mã ứng dụng của bạn chỉ nuốt tất cả các lỗi ...
Aaron Bertrand


Bạn có thể hiển thị định nghĩa của trình tự của bạn? Ngoài ra, bạn có thể kiểm tra nhật ký lỗi để xem liệu có sự kiện quan trọng nào xảy ra qua đêm không (ví dụ: chuyển đổi dự phòng, khởi động lại dịch vụ, sự cố bộ nhớ, v.v.)?
Aaron Bertrand

2
@@VERSIONgì Cũng có gì thay đổi về môi trường? Có một mục kết nối báo cáo một cái gì đó tương tự. OP ở đó nghĩ rằng nó được liên kết với11.0.3000.0
Martin Smith

2
Chà, CYCLE về cơ bản nói với SQL Server rằng bạn ổn với việc sử dụng lại các giá trị. Tôi hoàn toàn không biết tại sao bạn lại gặp phải vấn đề này và không biết rằng bạn sẽ tìm hiểu lý do tại sao (bạn dành bao nhiêu thời gian để điều tra lý do tại sao bạn bị xì lốp, trước khi bạn thay thế nó?). Tôi vẫn nghĩ rằng đặt cược tốt nhất của bạn là có một ràng buộc ở đó để ngăn chặn các bản sao và tắt bộ nhớ đệm với hy vọng ngăn chặn việc sử dụng lại.
Aaron Bertrand

Câu trả lời:


11

Đầu tiên, nếu bạn không muốn trùng lặp trong cột này, hãy nói rõ điều đó .

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(Hoặc bạn có thể muốn tạo khóa chính đó hoặc thay đổi chỉ mục được nhóm hoặc những gì có bạn ...)

Trong mọi trường hợp, việc đưa ra một lỗi khi bạn tạo một bản sao sẽ tốt hơn nhiều so với việc chèn một cách mù quáng một bản sao mà bạn sẽ phải xử lý sau này.

Tiếp theo, hãy xem xét rằng SEQUENCE chỉ là một trình tạo số và theo mặc định, nó có bộ đệm gồm 50 giá trị. Tùy thuộc vào cách các giao dịch của bạn được thiết lập và những sự kiện quan trọng nào khác xảy ra trên máy chủ, có thể SQL Server có thể "quên" rằng nó tạo ra các giá trị nhất định cho bạn. Xin lỗi nhưng tôi không biết chính xác yếu tố nào để tái tạo lỗi này. Cách khắc phục điều này (cho đến khi lỗi được giải quyết / giải thích ) là thay đổi trình tự sử dụng NO CYCLENO CACHE, vd:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Lưu ý rằng NO CACHEcó thể ảnh hưởng đến hiệu suất và đồng thời, nhưng sẽ giúp loại bỏ các khoảng trống, các khối bị mất và, ai biết được, có thể vấn đề của bạn cũng vậy.

Bạn cũng có thể muốn xác minh rằng bạn đang sử dụng gói dịch vụ và CU gần đây nhất. Tại thời điểm này tôi khuyên dùng SP1CU10 với 3437 ; SP2 đã ra ngoài nhưng vẫn còn một vấn đề quan trọng ở đó với việc xây dựng lại trực tuyến có thể ảnh hưởng đến bạn .


Chà, tôi không thể có nó sao lưu. Vì vậy, nếu NO CACHE sẽ sửa nó, thì đó là những gì tôi sẽ làm.
Núi lửa

Tôi nghĩ rằng có thể có giao dịch gây ra điều này. Nhưng trang Sequence trên MSDN cho biết "Số thứ tự được tạo ra ngoài phạm vi của giao dịch hiện tại. Chúng được tiêu thụ cho dù giao dịch sử dụng số thứ tự được cam kết hay được khôi phục." Vì vậy, tôi đã loại bỏ lý thuyết giao dịch của tôi. Tôi đồng ý phải có một cái gì đó khác đang diễn ra.
Núi lửa

Hóa ra chỉ cần thiết lập nó NO CYCLElà đủ. (Ít nhất nó đã không xảy ra đêm qua.) Cảm ơn bạn đã giúp đỡ!
Núi lửa

1
Khắc phục: Đối tượng trình tự tạo các giá trị chuỗi trùng lặp khi SQL Server 2012 hoặc SQL Server 2014 chịu áp lực bộ nhớ Giả sử rằng bạn tạo một đối tượng chuỗi có tùy chọn CACHE được bật trong Microsoft SQL Server 2012 hoặc SQL Server 2014. Khi phiên bản chịu áp lực bộ nhớ và nhiều kết nối đồng thời yêu cầu các giá trị chuỗi từ cùng một đối tượng chuỗi, các giá trị chuỗi trùng lặp có thể được tạo. Ngoài ra, lỗi vi phạm khóa duy nhất hoặc khóa chính (PK) xảy ra khi giá trị chuỗi trùng lặp được chèn vào bảng.
Andomar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.