Sequence — ma’lumotlar bazasida ketma-ket raqamlarni xavfsiz va parallel tarzda ishlab chiqaradigan obyekt. U ko‘pincha table primary keylari, hujjat raqami yoki boshqa numeric identifikatorlar uchun ishlatiladi.
Sequence table rowiga bevosita bog‘liq bo‘lishi yoki mustaqil ishlatilishi mumkin.
Keyingi qiymat
Sequence’dan yangi qiymat olinadi:
NEXT VALUE
yoki database’ga xos function orqali.
Har chaqiriq sequence holatini oldinga siljitadi.
Parallel transactionlar bir xil qiymat olmaydi.
Joriy qiymat
Session yoki connection oxirgi olgan sequence qiymatini ko‘rishi mumkin.
Global “eng oxirgi qiymat”ga tayanish parallel requestda xavfli.
Insert qilgan row IDsi driver yoki RETURNINGga o‘xshash mexanizm orqali aynan shu statementdan olinadi.
Transactiondan mustaqillik
Ko‘p database’larda sequence qiymati transaction rollback bo‘lsa ham qaytarilmaydi.
Misol:
- sequence 100 berdi;
- insert xato bo‘ldi;
- rollback;
- keyingi qiymat 101.
Shuning uchun sequence’da bo‘shliq bo‘lishi normal.
Gapless raqam muammosi
Sequence uzluksiz raqamlar kafolatlamaydi.
Gaplar:
sabab paydo bo‘ladi.
Legal invoice raqami gapless bo‘lishi kerak bo‘lsa oddiy high-throughput sequence’dan boshqa, qat’iy transaction va auditga ega alohida mexanizm kerak.
Start va increment
Sequence konfiguratsiyasi:
- start;
- increment;
- minimum;
- maximum;
- cycle;
- cache.
Masalan, increment = 10 bo‘lsa:
10, 20, 30, ...
qiymatlar hosil bo‘ladi.
Cycle
Maximum qiymatga yetganda sequence minimumdan qayta boshlashi mumkin.
Primary key uchun cycle odatda xavfli, chunki eski IDlar bilan collision yuz beradi.
Cycle cheklangan ring yoki maxsus numbering uchun ishlatilishi mumkin.
Cache
Performance uchun database bir guruh sequence qiymatlarini memory’da oldindan ajratadi.
Afzalligi — har ID uchun durable state yozuvi kamayadi.
Crash bo‘lsa ishlatilmagan cached qiymatlar yo‘qolib, sequence’da katta gap paydo bo‘lishi mumkin.
Cache uniquenessni buzmaydi.
Identity column
Table column sequence yoki ichki generator bilan avtomatik to‘ldirilishi mumkin.
id BIGINT GENERATED ...
Identity column table schema’sining bir qismi sifatida ko‘rinadi.
Sequence alohida obyekt bo‘lishi yoki database tomonidan yashirin yaratilishi mumkin.
Serialga o‘xshash shortcut
Ayrim database’larda maxsus pseudo-type yoki shorthand:
- sequence yaratadi;
- defaultni
nextvalga bog‘laydi; - ownership o‘rnatadi.
Bu haqiqiy data type bo‘lmasligi mumkin.
Schema dump va migrationda hosil qilingan obyektlar ko‘rinadi.
Ownership
Sequence ma’lum table columniga tegishli qilib belgilanishi mumkin.
Table yoki column drop qilinsa sequence ham o‘chirilishi policyga bog‘liq.
Mustaqil sequence bir nechta table tomonidan ishlatilishi mumkin.
Permission
Userga:
- keyingi qiymat olish;
- joriy qiymat ko‘rish;
- sequence sozlamasini o‘zgartirish
uchun alohida huquqlar berilishi mumkin.
Table’ga insert huquqi bo‘lsa ham sequence’dan foydalanish huquqi yetishmasligi mumkin.
Reset
Data import yoki migrationdan keyin sequence table’dagi maksimal IDdan orqada qolishi mumkin.
Keyingi insert mavjud primary key bilan collision qiladi.
Sequence qiymati table holatiga mos ravishda xavfsiz transaction va exclusive nazorat bilan yangilanadi.
Parallelism
Sequence global lockga o‘xshab barcha transactionni to‘liq ketma-ketlashtirmasdan unique raqam beradi.
Cache va ichki synchronization yuqori throughputni ta’minlaydi.
Lekin bitta global sequence juda katta distributed tizimda coordination nuqtasiga aylanishi mumkin.
Distributed ID
Bir nechta mustaqil region yoki shard global sequence’ni ulashsa network dependency paydo bo‘ladi.
Alternativalar:
- UUID;
- shard ID va local sequence;
- vaqtga asoslangan distributed ID;
- oldindan ajratilgan range;
- sequence hi-lo.
Har yondashuv ordering, hajm va collision xususiyatiga ega.
Hi-lo algoritmi
Database sequence’dan katta high qiymat olinadi.
Application memory’da bir nechta low qiymat yaratadi.
Masalan, bitta database chaqirig‘i bilan 1000 ID diapazoni ajratiladi.
Bu round-tripni kamaytiradi, ammo crash ishlatilmagan IDlarda gap qoldiradi.
Sequence va tartib
Sequence ID katta bo‘lsa record albatta keyin commit qilingan degani emas.
Transaction A 100ni olib uzoq ishlashi, B 101ni olib oldin commit qilishi mumkin.
Vaqt tartibi uchun timestamp va commit semantikasi alohida ishlatiladi.
Security
Public ko‘rinadigan ketma-ket ID:
- record sonini taxmin qilish;
- enumeration;
- boshqa obyekt IDlarini sinash
imkonini beradi.
Authorization har requestda tekshiriladi.
Tashqi URL uchun random public ID ishlatilishi mumkin, ammo bu permission o‘rnini bosmaydi.
Monitoring
Sequence maximumga qanchalik yaqinligi kuzatiladi.
32-bit integer katta workload’da tugashi mumkin.
Type’ni kengaytirish migrationi oldindan rejalashtiriladi.
Current value va table max ID farqi ham tekshirilishi mumkin.
Sequence contention
Juda katta parallel workload’da kichik cache bilan global sequence tez-tez durable state yangilashi mumkin.
Cache hajmini oshirish round-trip va lock bosimini kamaytiradi.
Evaziga crashdan keyingi bo‘sh raqamlar ko‘payadi.
Migration
Sequence nomi, owneri yoki data type’i migrationda aniq saqlanadi.
Table data’sini ko‘chirganda yangi sequence maksimal mavjud IDdan yuqori qiymatga o‘rnatiladi.
Aks holda keyingi insert primary key conflict beradi.
Audit raqami
Sequence qiymati texnik ID uchun mos, ammo huquqiy hujjat raqami uchun davr, filial va bekor qilingan raqamlar auditi kabi qo‘shimcha qoidalar talab qilinadi.
Bog‘liq tushunchalar
Identity column, Primary key, Auto increment, Surrogate key, UUID, Distributed ID, Hi-lo algorithm, Transaction, Sequence cache