Mysql işleminden satır kilitleri, masa kilitleri, iyimser kilitler ve kötümser kilitleri tanıtmak için güncelleme için seçin

Genel Bakış

MySQL'deki işlem varsayılan olarak otomatik olarak yapılır, yani autocommit = 1; ancak bu durumda, bazı durumlarda problemler olacaktır: Örneğin, bir seferde 1000 parça veri eklemek isterseniz, mysql 1000 kez işleyecektir, bu Performansı büyük ölçüde etkileyecektir.

Şu anda autocommit'i kapatmamız gerekiyor, aslında işlemin özelliklerini daha iyi yansıtmak için bir commit yeterli olduğu sürece program tarafından da kontrol edilebilir!

Bir kilit, iki yargı, üç güncelleme

Miktar, sayı vb. Gibi manipüle edilmesi gereken değerler için!

Bir prensibi hatırlayın: bir kilit, iki değerlendirme, üç güncelleme

MySQL'in InnoDB'sinde, varsayılan Tansaction izolasyon seviyesi TEKRARLANABİLİR OKUMA'dır (yeniden okunabilir)

SELECT'teki okuma kilidi temel olarak iki yola ayrılmıştır:

  • SEÇ ... PAYLAŞIM MODUNDA KİLİT
  • GÜNCELLEME İÇİN SEÇİN ...

Bu iki yöntem, işlem (İşlem) sırasında aynı veri tablosuna SEÇ uygulandığında çalıştırılmadan önce diğer işlem verilerinin gönderilmesini (Teslim) beklemelidir.

Temel fark, bir işlem aynı formu güncellemek istediğinde PAYLAŞIM MODUNDA KİLİTLEME'nin kolayca kilitlenmeye neden olabilmesidir.

Basitçe ifade etmek gerekirse, aynı formu SELECT'ten sonra GÜNCELLEMEK istiyorsanız, en iyisi SELECT ... UPDATE kullanmaktır.

Örnek

Ürün formundaki mal miktarını depolayan bir miktar olduğu varsayılarak, sipariş oluşturulmadan önce mal miktarının yeterli olup olmadığı (miktar) belirlenmelidir. > 0) ve ardından miktarı 1 olarak güncelleyin.

Sql aşağıdaki gibidir:

İd = 3 olan ürünlerden miktar seçin; GÜNCELLEME ürünleri SET miktarı = 1 WHERE id = 3;

Aslında burası güvenli değil.

Neden güvenli değil

Az miktarda koşullarda bir sorun olmayabilir, ancak "ironik bir şekilde" büyük miktarda veri erişimi sorunlara neden olacaktır. Miktar olarak ihtiyacımız olursa > Envanter yalnızca 0 koşulunda düşülebilir. SELECT'in ilk satırında program tarafından okunan miktarın 2 olduğunu varsayarsak, sayı yanlış görünebilir, ancak MySQL güncellenmek üzereyken birisi envanteri 0'a düşürmüş olabilir, ancak program Ama bilmiyordum ve yanlış GÜNCELLEME yaptım. Bu nedenle, okunan ve gönderilen verilerin doğru olmasını sağlamak için bir işlem mekanizması benimsenmelidir.

Sql'yi aşağıdaki gibi değiştirin:

AUTOCOMMIT AYARLA = 0; İŞE BAŞLAMAK; GÜNCELLEME İÇİN id = 3 NEREDE ürünlerden miktar seçin;

Şu anda, ürün verilerinde id = 3 olan veriler kilitlidir ve diğer işlemlerin, GÜNCELLEME İÇİN İD = 3 NEREDE ÜRÜNLERDEN SEÇİMİ yürütmeden önce işlemin gönderilmesini beklemesi gerekir.

Bu, diğer işlemlerde miktar tarafından okunan sayının doğru olmasını sağlar.

GÜNCELLEME ürünleri SET miktarı = '1' NEREDE id = 3; TAAHHÜT;

Commit veritabanına yazılır ve ürünlerin kilidi açılır.

Açıklama:

Not 1: BEGIN / COMMIT, işlemin başlangıç ve bitiş noktasıdır.Kilit durumunu etkileşimli olarak gözlemlemek için iki veya daha fazla MySQL Komut penceresi kullanabilirsiniz. Not 2: İşlem sırasında sadece SEÇ ... İÇİN GÜNCELLEME veya PAYLAŞIM MODUNDA KİLİTLE, aynı veri çalıştırıldığında diğer işlemlerin bitmesini bekleyecektir Genel olarak, SEÇ ... bundan etkilenmez. Not 3: InnoDB varsayılan olarak Satır Düzeyinde Kilit'e ayarlandığından, veri sütunlarının kilidi için lütfen bu makaleye bakın. Not 4: InnoDB formlarında LOCK TABLES komutunu kullanmamaya çalışın.Kullanmanız gerekiyorsa, sık sık sistem kilitlenmelerini önlemek için lütfen InnoDB'de LOCK TABLES kullanımına ilişkin resmi talimatları okuyun.

MySQL SELECT'in Satır Kilidi ve Tablo Kilidi ... GÜNCELLEME İÇİN

Önceki esas olarak SELECT ... FOR UPDATE kullanımını tanıttı, ancak kilidin (Lock) verileri değerlendirilmeli ve buna dikkat etmelisiniz. InnoDB varsayılan olarak Satır Seviyesi Kilidi olduğundan, MySQL yalnızca birincil anahtar "açıkça" belirtilirse Satır kilidi çalıştırır (yalnızca seçilen verileri kilitler), aksi takdirde MySQL Tablo Kilidi'ni yürütür (tüm veri formunu kilitler) ).

MySQL kabaca aşağıdaki üç kilitle özetlenebilir:

  • Tablo düzeyinde kilitler: düşük ek yük ve hızlı kilitleme; kilitlenme yok; büyük kilitleme ayrıntı düzeyi, kilit çakışmalarının en yüksek olasılığı ve en düşük eşzamanlılık.
  • Satır düzeyinde kilitler: pahalı ve yavaş kilitlenir; kilitlenmeler meydana gelir; kilit ayrıntı düzeyi en küçüktür, kilit çakışması olasılığı en düşüktür ve eşzamanlılık en yüksektir.
  • Sayfa kilidi: ek yük ve kilit süresi, tablo kilidi ile satır kilidi arasındadır; kilitlenme meydana gelir; kilit ayrıntı düzeyi, tablo kilidi ile satır kilidi arasındadır ve eşzamanlılık geneldir

Örnekler:

İki alan, id ve ad içeren bir ürün formu olduğunu ve id'nin birincil anahtar olduğunu varsayalım.

Örnek 1: (Birincil anahtarı açıkça belirtin ve bu verilere sahip olun, satır kilidi)

GÜNCELLEME İÇİN id = '3' ÜRÜNLERDEN SEÇİN;

Örnek 2: (Birincil anahtar yok, masa kilidi)

ÜRÜNLERDEN SEÇİN * WHERE name = GÜNCELLEME İÇİN 'Fare';

Örnek 3: (Birincil anahtar açık değil, tablo kilidi)

ID WHERE ürünlerinden SEÇ * < > GÜNCELLEME İÇİN '3';

Örnek 4: (Birincil anahtar açık değil, masa kilidi)

GÜNCELLEME İÇİN KİMLİĞİ '3' GİBİ ÜRÜNLERDEN SEÇİN *;

Not: Myisam yalnızca tablo düzeyinde kilitleri destekler, InnerDB satır düzeyinde kilitleri destekler. Kilitlerle (satır düzeyinde kilit / masa düzeyinde kilit) eklenen veriler diğer işlemler tarafından yeniden kilitlenemez veya diğer işlemler tarafından değiştirilemez.

(Değiştirin, silin). Tablo düzeyinde bir kilit olduğunda, kaydın bulunup bulunmadığına bakılmaksızın tablo kilitlenir.

İyimser ve kötümser kilitleme stratejileri

Kötümser kilit: verileri okurken bu satırları kilitleyin, bu satırlardaki diğer güncellemelerin devam etmek için karamsar kilidin sonuna kadar beklemesi gerekir.

İyimser kilit: Veri okurken kilitli değildir.Güncelleme sırasında verinin güncellenip güncellenmediğini kontrol edin.Eğer öyleyse mevcut güncellemeyi iptal edin.Genel olarak, karamsar kilit bekleme süresi kabul edilemeyecek kadar uzun olduğunda iyimser kilit seçeceğiz.

sonuç olarak

Bugün, esas olarak güncelleme ve veri tutarlılığı işleme için mysql işlem seçimini paylaşıyorum ve ardından sıra kilitleri ve tablo kilitleri, karamsar kilitler ve iyimser kilitler ekliyorum.Daha sonra mysql kilitlerinin içerik ve farklılıklarını ayrı ayrı sıralayacağım.İlgili arkadaşlar buna dikkat edebilir. !

Hawick Lau, boşandıktan sonra ortaya çıktı ve kızıyla mutlu bir şekilde gülümsedi, Yang Mi yalnız ve sıkıntılıydı
önceki
Nicholas Tse'nin kimliği her zaman yanlış mı anlaşılıyor? Açıklamak için gece geç saatlerde fotoğrafları sergilemek, diğerleri biraz çaresiz olduklarını anlıyor
Sonraki
Apple iPhone X değil! Aralık ayının en popüler cep telefonları bu ikisiydi ve yerli markalar çok kasvetli!
Yue Yunpeng çırağının performansını arka eliyle izledi, eylemleri Guo Degang'a çok benziyordu, ustası ve oğlu şefkatliydi
Elektrik girişi için vazgeçilmez, Siemens PLC başlangıçtan pratiğe, teori artı pratik kullanım!
Wang Shileinin karısı, Yang Mi'yi boşandığı için övdü ve Da Mi'nin arkasında büyük bir bağlılık vardı ve Hawick Lau tükenmiş gibiydi.
Siemens PLC, dijital tüp ekranını kontrol eder ve mühendislik örneği, otopark PLC programını açıklar!
Haval H2 sökmenin sözde "360 ° çepeçevre koruması" ne olacak?
Li Xiang'ın Japonya'ya seyahat eden üç kişilik ailesi, Wang Shiling'in değişiklikleri tanınmıyor ve yüzü daha yuvarlak ve daha uzun.
iPhone8, PS4'e meydan okuyor! Cep telefonu performansı oyun konsollarını gerçekten yenebilir mi?
Elektrikçilerin okuması gereken 30 yüksek gerilim sekonder devre şeması, elektrikçilerin% 80'inden fazlasının deneyimli olması gerektiğini bilin
MySQL veritabanında birleşik dizin ve en soldaki eşleştirme ilkesini açıklayın
990 milyar! Eski makinenin performansını kasıtlı olarak düşürme skandalı Apple'ı titretmişti: Gerçekten buna gücüm yetmez!
"Deformasyon Ölçer" filminden plastik cerrahi kızı Han Anran, birkaç günlük evlilikten sonra altı aylık hamile mi?
To Top