Postgresql-də son nöqtələrlə məşğul olmaq

İdeal bir istehsal mühitində hamımız verilənlər bazamızdan bir problem çıxardıq. Masanızın (lərin) kilidlənməsinin arxasında bir çox səbəb ola bilər. Problemləri həll etmək üçün bir neçə ssenari və potensial düzəlişlərdən keçəcəyik.

Ssenari 1: Ən çox yayılmış ssenari.

Mövzu 1: yeniləmə işçisi dəsti adı = 'ram' burada id = 1

→ Bu ifadədə id = 1 olduğu sıra bağlanır

Mövzu 2: yeniləyin işçi dəsti adı = 'akash' burada id = 2

→ Bu ifadədə id = 2 olduğu sıra bağlanır

Mövzu 1: yeniləyin işçi dəsti adı = 'prasanna' burada id = 2

→ Bu bəyanat bu cərgədə kilid əldə etməyə çalışacaq, lakin kilidi artıq ip2 ilə düzəldildiyi üçün edə bilmir. Beləliklə, kilidin sərbəst buraxılması üçün 2 ipi gözləyəcək.

Mövzu 2: yeniləmə işçisi dəsti adı = 'prashant' burada id = 1

→ Bu bəyanat bu cərgədə kilid əldə etməyə çalışacaq, lakin kilidi artıq mövzu1 ilə düzəldildiyi üçün edə bilmir. Beləliklə, mövzu1 kilidin sərbəst buraxılacağını gözləyəcək, bu, heç vaxt olmayacaq, çünki hər ikisi bir-birinə qarşı bir kilid tutur və son qoyur.

Ssenari 2:

Eyni tələbi eyni vaxtda icra edərkən.

Mövzu 1:

işçi dəsti rolunu yeniləyin = 'dev', adı ('ram', 'prashant', 'aakash')

→ IN bəndində yenilənməni göstərilən qaydada yerinə yetirmək lazım deyil. Məsələn, yuxarıdakı ifadə yeniləməni aşağıdakı qaydada həyata keçirə bilər 'prashant', 'aakash', 'ram'.

Mövzu 2:

işçi dəsti rolunu yeniləyin = 'dev', adı ('ram', 'prashant', 'aakash')

1 ipdən eyni vəziyyət buraya tətbiq olunur və yuxarıdakı ifadə sorğu bu qaydada icra edə bilər → 'ram', 'prashant', 'aakash'

Bəs problem nədir?

Mövzu 1, əvvəlcə adı = 'prashant' və Thread2 olduğu sıranı kilidləsə, adı = 'ram' olduğu sıranı kilidləsək, yenidən bir problem tapacağıq, çünki növbəti ifadələr dəsti kilidin sərbəst buraxılması üçün bu əməliyyatların hər birindən asılı olacaqdır.

Bəs onda dözülməzliyi necə həll edə bilərik?

PostgreSQL-də, əməliyyatın içərisində olan bütün sətirləri bir anda kilidləmək və əməliyyat bitdikdən sonra hamısını buraxmaq üçün bir seçimimiz var.

Bunu həqiqətən necə edə biləcəyimizi göstərmək üçün bir nümunə götürək,

Başlayın;

Yeniləmə ÜÇÜN (1,2,3) olduğu işçidən 1 SEÇİM;

işçi dəsti rolunu yeniləyin ('ram', 'prashant', 'aakash');

SON;

SELECT istifadə edərək ... ÜÇÜN YENİLƏNİB bütün şərtlər daxilində göstərilən bir dəfə kilidi tətbiq edir və bununla da əməliyyat başa çatdıqdan sonra bir dəfə sərbəst buraxılır. Sərin deyil :)

Xahiş edirəm SEÇMƏDƏN ehtiyatlı olun ... YENİLƏNİB, xarici açar sütuna və istinad cədvəlinə təsir etdiyi üçün. İstənilən halda istinad süfrəsində istinad olunan sahədə xüsusi bir dəyişiklik varsa, əməliyyat bitənə qədər kilidlənəcəkdir.

Bu bloqu oxuduğunuz üçün təşəkkür edirik. Ümid edirəm kömək edir :)