Bir veritabanı işlemi ile kilitleme arasındaki kesin ilişki nedir?


16

Bu, bilgimi arttırmak ruhu ile sorulan alçakgönüllü bir sorudur; lütfen cevabınızda nazik olun.

Uzun süreli bir uygulama geliştiricisi olarak, bir düzeyde bir işlemin ne olduğunu biliyorum (her zaman kullanıyorum). Şu an için işlem izolasyon seviyelerini bir kenara bırakarak, yüksek seviyede bir işlem, bir iş bloğunun tamamen tamamlanmasına veya hiç tamamlanmamasına izin verir ve diğer veritabanı değiştirici faaliyetlerden belirli bir miktarda izolasyona izin verir.

Ayrıca bir kilidin ne olduğunu (çeşitli veritabanlarında) ya da en azından bir kişinin nasıl davrandığını biliyorum (bir tabloyu açıkça bir şekilde kilitlersem, o zaman başka hiçbir işlem ya da iş parçacığı bu tablo hakkında bir şey güncelleyemez).

Ne en belirgin am değil temizlemek hakkındadır: Çeşitli veritabanlarında, ne zaman açıkça, bir satır veya bir tablo kilidi düzgün işlem çalışması için yorganın altında veritabanının işlem tesislerinin tarafından kullanılan aynı yapıları kullanan ben?

Yani, bir işlemin atomik ve izole olması için biraz kilitleme yapması gerekiyor. Bu işlem tarafından başlatılan, tranasction-hidden kilitleme, çeşitli veritabanlarının SELECT FOR UPDATEaçık LOCKkomutlar veya açık komutlar gibi yapılardan erişmeme izin verdiği kilitle aynı mı? Yoksa bu iki kavram tamamen farklı mı?

Yine bu sorunun saflığı için özür dilerim; Daha temel kaynaklara işaret etmekten mutluluk duyuyorum.

Yanıtlar:


12

bir satır veya tabloyu açıkça kilitlediğimde, işlemin düzgün çalışmasını sağlamak için veritabanının işlem olanakları tarafından kapaklar altında kullanılanla aynı yapıları mı kullanıyorum?

Evet. Bu doğru olmazsa, kendi 'kilitlemeniz' sadece benzer diğer kilitlemelerin kapsamına girer ve motorun kendi kilitlemesiyle etkileşime girmez. Böylece bir tablodaki bir satırı kilitlersiniz, böylece başka bir uygulama tarafından aynı şekilde kilitlenemez, ancak kilidiniz motorun kendisi tarafından yok sayılır. Bu anlambilim nadiren istenir. Çoğu zaman bir satırı kilitleyen bir uygulama 'onu herhangi bir erişim / değiştirme yöntemine karşı kilitleme' anlamına gelir. Kesinlikle uygulama özgü kilitleme mekanizmaları olduğunu Yan not do onlar faydalıdır, çünkü mevcut. Örneğin, SQL Server'ın uygulama kilitleri vardır .

bir işlemin atomik ve izole olabilmesi için bir miktar kilitleme yapması gerektiğini düşünüyorum.

Kilitleme bunu başarmanın bir yoludur. En büyük alternatif versiyonlamadır. Günümüzde çoğu veritabanı her ikisini de desteklemektedir (bu, uygulamadaki bir satırı 'kilitlediğiniz' ancak başka bir işlemin satırı okumak için sürüm oluşturmayı kullandığı anlamına gelir, çünkü kilitleme, sürümlendirilmiş okumaları engellemediği için bunu okuyacaktır).

Veritabanı uygulama dünyasında 'iki fazlı kilitleme protokolü' olarak bilinen bir kavram etrafında dolaşıyorsunuz . bağlantılı Wikipedia makalesi iyi bir başlangıç. Bu konuyla ilgili daha ayrıntılı bir açıklama okumak isterseniz, kütüphaneye gitmenizi ve İşlem İşleme: Kavramlar ve Teknikler hakkında kredi talep etmenizi öneririm . Hemen hemen her veritabanı, özünde, bu kitabın bir uygulamasıdır.



Aha! Şimdi konuşuyoruz. Gerçekten, aklımın arkasında gizlenen MVCC idi . İyi ifade edilmiş cevaplar, harika referanslar ve sorumu gerçekten incelemek için zaman ayırdığınız için teşekkür ederim.
Laird Nelson

3

Sorularınızı cevaplamadan önce arka plan bilgisi:

Not: Bu, Microsoft SQL Server - RDBMS ........ ile ilgilidir

  • Çok basit bir ifadeyle, bir işlem bütünüyle tek bir mantıksal birim olarak gerçekleştirilmesi gereken ve ACID özelliklerini sürdürmesi gereken bir çalışma dizisidir.
  • Herhangi bir RDBMS, işlem yalıtımını ve dayanıklılığını koruyarak işlemi bütünüyle tamamlamak için kullanılabilecek "kilitleme tesisleri" sağlamalıdır. Bu, veritabanının fiziksel bütünlüğünü sağlar.
  • En önemlisi, varsayılan olarak - işlemler bağlantı düzeyinde yönetilir. Bu nedenle, bir bağlantıda bir işlem başlatıldığında, bu bağlantıda yürütülen tüm T-SQL deyimleri (S / I / U / D) işlem bitene kadar işlemin bir parçasıdır. ( MARS farklı ele alınır)

Şimdi sorularınıza geri dönün:

bir satır veya tabloyu açıkça kilitlediğimde, işlemin düzgün çalışmasını sağlamak için veritabanının işlem olanakları tarafından kapaklar altında kullanılanla aynı yapıları mı kullanıyorum?

Evet. Bu, değiştirilecek ve veritabanını tutarlı bir duruma bırakacak olan veri dizisini belirlemede dikkatli olmanız gerektiği anlamına gelir. Başka bir deyişle, DML işleminiz veritabanını kuruluşunuzun iş kurallarıyla sınırlı tutarlı bir durumda bırakmalıdır. Yine de, RDBMS (burada SQL Server) işlemin fiziksel bütünlüğünü zorlayabilir.

BOL'dan: Kilitleme ve satır sürümü oluşturma, kullanıcıların taahhüt edilmemiş verileri okumasını ve birden çok kullanıcının aynı verileri aynı anda değiştirmeye çalışmasını önler. Kilitleme veya satır sürümü oluşturma olmadan, bu verilere karşı yürütülen sorgular henüz veritabanında işlenmemiş veriler döndürülerek beklenmedik sonuçlar doğurabilir.

Bu işlem tarafından başlatılan, işlem gizli kilitleme, çeşitli veritabanlarının UPDATE SELECT veya açık LOCK komutları gibi yapılar üzerinden erişmeme izin verdiği kilitlemeyle aynı mı?

Sql sunucusundaki her şey bir işlemde bulunur. Verilerinize eriştiğinizde, RDBMS, yalıtım düzeyine ve verilerinizde gerçekleştirdiğiniz İşlemlere bağlı olarak kilitler almak zorundadır. Daha fazla ayrıntı için bu cevabı kontrol edin .

Bazı iyi referanslar:


2

İşlemlerin bir anlamda veritabanı "arayüzünün" bir parçası olduğunu söyleyebilirim, bir geliştirici olarak, ne zaman başlayacağınıza, bitireceğinize, işlemler kapsamında ne yapacağınıza karar verdiğinizi vb. Kilitler, gördüğüm gibi, uygulama detaylarına aittir ve farklı nesnelerle erişim senkronizasyonu için kullanılır. Çoğu durumda motorun kendisi neyin ve ne kadar süreyle kilitlenmesi gerektiğine karar verir. Doğrudan değiştirilemeyen birçok sistem seviyesi kilidi vardır (örneğin, motor belirli bellek alanlarını kilitleyebilir). DML kilitleri söz konusu olduğunda bile, bunların çoğu sahnenin arkasında gerçekleşir (örneğin, Oracle'ın referans bütünlüğünü sağlamak için ve hatırladığım kadarıyla, SQLServer yeni kayıt eklendiğinde ana tablodaki ilgili bir satıra kilit koyabilir Ayrıntılar Tablosu), işlem içinde yayınlanan DML ifadeleri sonucunda.

İşlemler söz konusu olduğunda, SQL ve destek işlemlerine uyduğunu iddia eden herhangi bir RDMS'den daha fazla veya daha az tutarlı davranış bekleyebilirsiniz, ancak kilit söz konusu olduğunda hemen hemen her tedarikçi farklı strateji ve terminoloji kullanır. Anlayabildiğim kadarıyla, tüm RMDS'ler arasındaki ortak nokta, işlemler arasındaki eşzamanlılığın izolasyon düzeyiyle tanımlanmış olması, kilitler arasındaki eşzamanlılığın ise kilit türleri (paylaşılan, özel, vb.) Tarafından kontrol edilmesidir.

Özetlemek gerekirse, kilitler nesnelerin tutarlılığını ve eşzamanlılığı kontrol etmek için düşük seviyeli mekanizmadır. Kilitler SQL deyimleri yürütülürken verilebilir. İşlem yalıtım düzeyi uygulamasına bağlı olarak, motor etkilenen nesnelere (satırlar, satır grubu, dizinler, vb.) Farklı türde kilitler yerleştirebilir. Manuel olarak kilitleri ( SELECT FOR UPDATE, LOCK) vermek için sınırlı sayıda komut vardır . DML kilitleri yükseltilebilir (örneğin, SQLServer satır-> sayfa-> bölüm-> tablosunda RDMS'ye bağlıdır). Kilitler ayrıca, bağlantı başlatma, yedeklemeler, geri yükleme, prosedür / tetikleyici / işlev / vb. Yeniden derleme, başlatma, kapatma, vb. Sırasında veritabanı motoru tarafından verilebilir.

Bunun sorunuza cevap verip vermediğinden emin değilim ama umarım mantıklıdır.


Yorumun için teşekkür ederim. Kesinlikle şimdiye kadar en yakınsın. Hala işlemleri her zaman, örneğin, açık LOCKveya SELECT FOR UPDATEdeyimler tarafından kullanılan kilitler açısından veya başka bir mekanizma yoluyla uygulanıp uygulanmadığını görmek için çalışıyorum .
Laird Nelson

Bildiğim kadarıyla BEGIN TRANSACTIONkilit yok. Kilitler işlemdeki DML'lerden sonra görünür.
a1ex07

Açıklama - BEGIN TRANSACTIONDML kilitleri oluşturmadığı anlamına geliyordu ; gerçekte bazı iç kilitler çıkarmalıdır, çünkü kaynakları tahsis
etmeli

1

SQL Server jargon kullanacağım, ancak kavramlar diğer satıcılar için aynı olmalıdır:

Yürüttüğünüz her komut bir işlem içinde yürütülür. Bu işlem, veritabanı motoru tarafından açıkça BEGIN TRAN ile veya dolaylı olarak açılabilir. Örtük bir işlemin açılmasının nedeni, motorun hala ACID uyumluluğunu ve geri alma yeteneğini sürdürmesi gerektiğidir.

GÜNCELLEME İÇİN SEÇİN, sadece işlem yapılırken belirli bir kilit tutacağı anlamına gelir.


Yorumun için teşekkür ederim. O kadarını biliyorum. Ama sorum hala: Bu işlem açıldığında, izolasyonu kendi kilitlerini tutarak gerçekleştiriliyor mu? Eğer öyleyse, bu kilitler açıkça elde edebileceğim aynı kilit türleri midir? Veya işlem başka yollarla izolasyon mu elde ediyor?
Laird Nelson

2
Evet, bu aynı mekanizma. İzolasyon, her iki moddaki kilitler kullanılarak elde edilir, açıkça elde edebileceğiniz kilitler. Fark, bir işlemi açık bir şekilde açmazsanız, komut tamamlandığında kilitler serbest bırakılırken, açık bir işlemde kilitler, siz kesinleşene kadar tutulur (yalıtım seviyeleri nedeniyle% 100 doğru değil), ancak bu Genel fikir).
Matan Yungman

Yorumun için teşekkür ederim. Sorumu sormamın nedeni, bazı veritabanlarının MVCC'yi ACID işlemlerini gerçekleştirmenin bir aracı olarak kullandığını, bunun bana bunu kilitlemesiz yapmanın bir yolu olduğunu okumam. Bu gibi durumlarda, ne zaman açıkça bir kilit vermek istediğim konusunda net değilim. Ama bu muhtemelen ayrı bir soru. :-)
Laird Nelson

@LairdNelson, SQL Server için Anlık Görüntü Yalıtım seviyesidir . Mevcut, ancak eşzamanlılık için varsayılan mekanizma değil. Bu, Oracle veya Postgresql için varsayılan IIRC'dir.
Marian

0

Kilit gereklidir ve veritabanını oluştururlar. Bu, diğerleri veritabanına yazarken birden çok kullanıcı okumaya çalıştığında verilerin bozulmasını veya geçersiz kılınmasını önler. İşlemsel yalıtım genellikle bir işlemde erişilenleri kilitleyerek uygulanır. Kötü tasarım uygulamaları veritabanı kilidi konseptinden büyük fayda sağlar :) !! Bu yüzden kilitlenmeyi önlemek için FK'nize ve veri düzeninize konsantre olun.

Her şey ASİT ile ilgili: - bunu okuyun ve zihninizi temizleyecek! ACID, veritabanını değiştirirken uygulamak istediğiniz bir dizi özelliktir.

  • ** Atomsallık
  • Tutarlılık
  • İzolasyon
  • dayanıklılık **

İşlem, bazı ACID özelliklerine ulaşmak için kullanılan bir dizi ilgili değişikliktir. İşlemler, ACID özelliklerini elde etmek için kullanılan araçlardır.

Atomisite, tüm işlemlerin gerçekleştiğini veya hiçbirinin gerçekleşmeyeceğini garanti edebileceğiniz anlamına gelir; karmaşık işlemleri tek bir birim, tümü veya hiçbir şey olarak yapabilirsiniz ve bir çökme, elektrik kesintisi, hata veya başka bir şey, yalnızca ilgili değişikliklerin bazılarının gerçekleştiği bir durumda olmanıza izin vermez.

Tutarlılık, verilerinizin tutarlı olacağını garanti ettiğiniz anlamına gelir; ilgili veriler üzerinde sahip olduğunuz kısıtlamaların hiçbiri ihlal edilmeyecektir.

Yalıtım, bir işlemin henüz tamamlanmamış başka bir işlemden veri okuyamayacağı anlamına gelir. İki işlem eşzamanlı olarak yürütülüyorsa, her biri dünyayı sırayla yürütüyormuş gibi görür ve birinin diğeri tarafından yazılan verileri okuması gerekiyorsa, diğerinin bitmesini beklemek gerekir.

Dayanıklılık, bir işlem tamamlandığında, tüm değişikliklerin dayanıklı bir ortama (sabit disk gibi) kaydedildiği ve işlemin tamamlandığı gerçeğinin kaydedildiği anlamına gelir.

Dolayısıyla, işlemler bu özellikleri garanti altına almak için bir mekanizmadır; bunlar, bir bütün olarak bir grup işlemin atomik olabileceği, tutarlı sonuçlar üretebileceği, diğer işlemlerden izole edilebileceği ve kalıcı olarak kaydedilebileceği şekilde ilgili eylemleri birlikte gruplamanın bir yoludur.


Yorumun için teşekkürler. En azından ACID'in özelliklerinin pasif bir şekilde farkındayım. Hala net değilim: İşlemler doğrudan açık LOCKifadeler aracılığıyla kullanabileceğim kilitleri kullanarak ACID uygular mı yoksa başka bir mekanizma kullanarak mı yaparlar?
Laird Nelson

Veritabanları, verileri seçerken ortaya çıkan kilitleme derecesini kontrol eden bir dizi işlem yalıtım düzeyi sunar. Senkronize edilebilir, Tekrarlanabilir okumalar, Okundu taahhüt edildi, Okunmadı okunmadı.
Up_One
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.