Jawaban:
Selama Anda tidak BERKOMIT atau ROLLBACK , transaksi masih "berjalan" dan berpotensi memiliki kunci.
Jika klien Anda (aplikasi atau pengguna) menutup koneksi ke database sebelum melakukan, setiap transaksi yang masih berjalan akan dibatalkan dan diakhiri.
Anda benar-benar dapat mencobanya sendiri, yang akan membantu Anda mengetahui cara kerjanya.
Buka dua jendela (tab) di studio manajemen, masing-masing akan memiliki koneksi sendiri ke sql.
Sekarang Anda dapat memulai transaksi dalam satu jendela, melakukan beberapa hal seperti menyisipkan / memperbarui / menghapus, tetapi belum melakukan. lalu di jendela lain Anda dapat melihat tampilan database dari luar transaksi. Bergantung pada tingkat isolasi, tabel mungkin dikunci sampai jendela pertama dilakukan, atau Anda mungkin (tidak) melihat apa yang telah dilakukan transaksi lain sejauh ini, dll.
Bermain-main dengan tingkat isolasi yang berbeda dan tanpa petunjuk kunci untuk melihat bagaimana pengaruhnya terhadap hasil.
Lihat juga apa yang terjadi jika Anda melakukan kesalahan dalam transaksi.
Sangat penting untuk memahami bagaimana semua hal ini bekerja atau Anda akan bingung dengan apa yang dilakukan sql, sering kali.
Selamat bersenang-senang! GJ.
Transaksi dimaksudkan untuk berjalan sepenuhnya atau tidak sama sekali. Satu-satunya cara untuk menyelesaikan transaksi adalah dengan berkomitmen, cara lain apa pun akan menghasilkan rollback.
Oleh karena itu, jika Anda memulai dan kemudian tidak melakukan, itu akan dibatalkan saat koneksi ditutup (karena transaksi terputus tanpa menandai sebagai selesai).
tergantung pada tingkat isolasi dari transaksi masuk.
Saat Anda membuka transaksi, tidak ada yang terkunci dengan sendirinya. Tetapi jika Anda menjalankan beberapa kueri di dalam transaksi itu, bergantung pada tingkat isolasi, beberapa baris, tabel, atau halaman akan dikunci sehingga akan memengaruhi kueri lain yang mencoba mengaksesnya dari transaksi lain.
Contoh Transaksi
mulai tran tt
Pernyataan sql Anda
jika terjadi kesalahan rollback tran tt else commit tran tt
Selama Anda belum mengeksekusi tran tt komit, data tidak akan berubah
BEGIN TRAN X ... BEGIN TRAN Y ... ROLLBACK Y
tidak berfungsi, misalnya. Lihat stackoverflow.com/questions/1273376/…
Selain masalah penguncian potensial yang mungkin Anda sebabkan, Anda juga akan menemukan bahwa log transaksi Anda mulai tumbuh karena tidak dapat dipotong melewati LSN minimum untuk transaksi aktif dan jika Anda menggunakan isolasi snapshot, toko versi Anda di tempdb akan bertambah untuk alasan serupa.
Anda dapat menggunakan dbcc opentran
untuk melihat detail dari transaksi terbuka terlama.
Setiap transaksi yang belum dilakukan akan membuat server terkunci dan kueri lain tidak akan dijalankan di server. Anda juga perlu mengembalikan transaksi atau melakukannya. Menutup SSMS juga akan menghentikan transaksi yang memungkinkan kueri lain untuk dieksekusi.
Perilaku tidak ditentukan, jadi Anda harus secara eksplisit menyetel komit atau rollback:
http://docs.oracle.com/cd/B10500_01/java.920/a96654/basic.htm#1003303
"Jika mode komit otomatis dinonaktifkan dan Anda menutup koneksi tanpa secara eksplisit melakukan atau mengembalikan perubahan terakhir Anda, maka operasi COMMIT implisit dijalankan."
Hsqldb melakukan rollback
con.setAutoCommit(false);
stmt.executeUpdate("insert into USER values ('" + insertedUserId + "','Anton','Alaf')");
con.close();
hasilnya adalah
2011-11-14 14: 20: 22.519 INFO utama [SqlAutoCommitExample: 55] [AutoCommit enabled = false] 2011-11-14 14: 20: 22.546 INFO utama [SqlAutoCommitExample: 65] [Ditemukan 0 # pengguna di database]