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!
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:
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.
Ü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.Ö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:
Ö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.
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.
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. !