Bir veritabanına işlem yapmazsanız (örneğin SQL Server) ne olur?


108

Bir sorgum olduğunu varsayalım:

begin tran
-- some other sql code

Ve sonra teslim olmayı veya geri dönmeyi unutuyorum.

Başka bir müşteri bir sorgu yürütmeye çalışırsa ne olur?

Yanıtlar:


148

Bir işlemi COMMIT veya ROLLBACK yapmadığınız sürece , hala "çalışıyor" ve potansiyel olarak kilitler tutuyor.

İstemciniz (uygulama veya kullanıcı) taahhütte bulunmadan önce veritabanına olan bağlantıyı kapatırsa, halen çalışan tüm işlemler geri alınır ve sonlandırılır.


1
mmm, tamam bunun bir çeşit kilit yarattığını anladım. Bağlantıyı kapatmanın beni bu durumdan gerçekten çıkaracağından emin değildim. sorun, işleme koymaya çalışırken bir hata almamdı. şimdi bağlantıyı kapattım ve hepsi işe yaradı.
Charbel

12
Yan not: Management Studio kullanıyorsanız, sorgu penceresini kapatmak bağlantıyı kapatır
Joe Phillips

3
@BradleyDotNET: evet, kesinlikle
marc_s

2
Varsayılan olarak, sorgu penceresini / bağlantısını kapatırsanız SQL Server Management Studio'nun otomatik olarak işleme koyacağını unutmayın.
Nuno

1
İstemci, bir işlem etkinken bağlantıyı kapattığında, her zaman geri alınmayacağını unutmayın - bu, istemciye ve db'ye bağlıdır. Örneğin, bir Java uygulaması bir Oracle veri tabanına bağlantıyı kapattığında, tüm açık bağlantılar otomatik olarak taahhüt edilir.
AviD

38

Aslında bunu kendiniz deneyebilirsiniz, bu nasıl çalıştığına dair bir fikir edinmenize yardımcı olacaktır.

Yönetim stüdyosunda iki pencere (sekme) açın, her birinin sql ile kendi bağlantısı olacaktır.

Artık tek bir pencerede işlem başlatabilir, ekleme / güncelleme / silme gibi bazı şeyler yapabilirsiniz, ancak henüz tamamlamayın. daha sonra diğer pencerede veritabanının işlemin dışından nasıl göründüğünü görebilirsiniz. İzolasyon düzeyine bağlı olarak, tablo ilk pencere tamamlanana kadar kilitlenebilir veya diğer işlemin şu ana kadar ne yaptığını vb. Göremezsiniz (göremezsiniz).

Sonuçları nasıl etkilediğini görmek için farklı izolasyon seviyeleri ile oynayın ve kilit ipucu yok.

Ayrıca işlemde bir hata attığınızda ne olduğuna bakın.

Tüm bunların nasıl çalıştığını anlamak çok önemlidir, yoksa çoğu zaman sql'nin yaptığı şey sizi şaşırtacaktır.

İyi eğlenceler! GJ.


tamam ama işlem en azından commit yayımlanmadan önce günlüğe yazılacak mı? Örneğin, bir işlemi başlatmak istediğimi varsayalım, commit komutunu çalıştırıp "başka bir şey yap" yapıyorum. insert komutum günlüğe yazılacak mı? bu şekilde, commit'i çalıştırmadan önce sunucu çökerse ... olduğu yere geri dönebilir ve daha sonra sadece commit yapabilirim ("başka bir şey" yaptığım zaman).
user1870400

16

İşlemlerin tamamen veya hiç yürütülmemesi amaçlanmıştır. Bir işlemi tamamlamanın tek yolu taahhüt etmektir, başka herhangi bir yol geri dönüşle sonuçlanacaktır.

Bu nedenle, başlarsanız ve daha sonra taahhüt etmezseniz, bağlantı kapatıldığında geri alınacaktır (işlem tamamlandı olarak işaretlenmeden kesildiği için).


Böyle olması gerekir, ancak durum her zaman böyle değildir.
FalcoGer

... mySQL'in işlemleri desteklemeyen MyISAM'ı gibi , elbette.
Piskvor,

3

gelen işlemin izolasyon düzeyine bağlıdır.

SQL işlem izolasyonu açıklandı


6
İşlemlerin davranışı, izolasyon seviyesine bağlı değildir. Sebep olabilecekleri kilitlerin miktarı.
marc_s

Bir bağlantı tarafından hangi verilerin okunabildiğinden kesinlikle eminim, kesinlikle izolasyon seviyesine bağlıdır. İzolasyonu READ UNCOMMITTED olarak ayarladıysanız, henüz taahhüt edilmemiş verileri okuyabilirsiniz ve aslında izin bir noktasında geri alınabilir, ancak bu, kilitlenmemesini sağlar. İzolasyon seviyeniz olarak READ COMMITTED'i seçtiyseniz, o zaman tamamlanmayan satırları okuyamazsınız - SNAPSHOT kullanmadığınız sürece ikinci istemci askıda kalır.
Xhalent

2

Bir işlemi açtığınızda hiçbir şey kendi kendine kilitlenmez. Ancak, izolasyon düzeyine bağlı olarak bu işlemin içinde bazı sorgular yürütürseniz, bazı satırlar, tablolar veya sayfalar kilitlenir, bu nedenle bu, diğer işlemlerden bunlara erişmeye çalışan diğer sorguları etkiler.


1

İşlem Örneği

tran tt'ye başla

Sql ifadeleriniz

hata oluştuysa geri alma tran tt else commit tran tt

Commit tran tt'yi gerçekleştirmediğiniz sürece, veriler değişmeyecektir.


1
İşlemleri adlandırmanın yalnızca MS SQL'de gereksiz olmadığını, yanlış bir kontrol hissi verebileceğini unutmayın. BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Yörneğin çalışmıyor. Bkz stackoverflow.com/questions/1273376/...

0

Neden olabileceğiniz potansiyel kilitleme sorunlarına ek olarak, işlem günlüklerinizin, etkin bir işlem için minimum LSN'yi geçemeyecekleri için büyümeye başladığını ve anlık görüntü izolasyonu kullanıyorsanız, tempdb'deki sürüm deponuzun büyüyeceğini göreceksiniz. benzer nedenler.

En dbcc opentraneski açık işlemin ayrıntılarını görmek için kullanabilirsiniz .


0

Herhangi bir tamamlanmayan işlem sunucuyu kilitli bırakır ve diğer sorgular sunucuda yürütülmez. İşlemi geri almanız veya tamamlamanız gerekir. SSMS'nin kapatılması, diğer sorguların yürütülmesine izin verecek işlemi de sonlandıracaktır.


-4

Davranış tanımlı değil, bu nedenle açıkça bir işleme veya geri alma ayarlamanız gerekir:

http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303

"Otomatik kesinleştirme modu devre dışı bırakılırsa ve son değişikliklerinizi açıkça taahhüt etmeden veya geri almadan bağlantıyı kapatırsanız, örtük bir COMMIT işlemi yürütülür."

Hsqldb geri dönüş yapıyor

con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" +  insertedUserId + "','Anton','Alaf')");
con.close();

sonuç

2011-11-14 14: 20: 22,519 ana BİLGİ [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22,546 main INFO [SqlAutoCommitExample: 65] [Veritabanında 0 # kullanıcı bulundu]


2
Bu Oracle için doğru olabilir (hiçbir fikrim yok), ancak sorgulayıcı MS-SQL hakkında soru soruyor
PaulG

İlk alıntı, sunucu için değil, JDBC sürücüsü için geçerlidir.
djechlin
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.