Yanıtlar:
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.
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.
İş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).
gelen işlemin izolasyon düzeyine bağlıdır.
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.
İş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.
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
örneğin çalışmıyor. Bkz stackoverflow.com/questions/1273376/...
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 opentran
eski açık işlemin ayrıntılarını görmek için kullanabilirsiniz .
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.
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]