Permintaan data sebelum transaksi komit

10

Pemahaman saya adalah bahwa, di jendela MS SQL Server Management Studio, setelah melakukan "mulai transaksi" dan kemudian membuat beberapa perubahan seperti menambahkan data ke tabel, Anda hanya dapat meminta tabel itu dan perubahan itu dari jendela yang sama sampai Anda melakukan "melakukan transaksi".

Apakah ada cara untuk melakukan kueri dari sumber lain sebelum melakukan "transaksi komit"?

Khusus untuk tujuan saya saat ini dan untuk menambahkan beberapa konteks. Saya melakukan beberapa pertanyaan SQL dari Excel Power Query. Saya benar-benar ingin dapat melakukan pertanyaan ini sebelum "melakukan transaksi" sehingga saya dapat melakukan beberapa analisis dan mencari tahu apakah saya harus melakukan kemunduran daripada komit.

Alex
sumber

Jawaban:

14

Ya, itu mungkin jika Anda mengubah tingkat isolasi transaksi untuk sesi (itulah yang Anda sebut "jendela" di SSMS) yang meminta data yang dimodifikasi. Seringkali ini bukan ide yang bagus, karena Anda mungkin mendapatkan beberapa hasil yang tidak terduga . Pertimbangkan efek sampingnya dengan cermat. Saya tidak tahu apakah mungkin untuk mengubah level isolasi transacion di Excel Power Query.

Sebagai contoh, set kueri berikut akan memasukkan beberapa data dan menampilkan pembaruan dengan benar bahkan tanpa komit / kembalikan.

-- Session 1
begin tran tx_test;
-- Assume the Test table exists and insert is okay
insert dbo.Test(datadate, content) values (getdate(), 'transaction');
select * from Test; -- Shows the new data
-- After select, one would execute one of the following
-- commit;
-- rollback;

Sementara itu, sesi kedua mengeksekusi pilih yang tampaknya tidak melakukan apa-apa:

-- Session 2
-- This waits for uncommitted transaction
-- and returns results after 1st session commits/rollbacks
select * from Test;

Buat sesi ketiga dan ubah tingkat isolasi:

-- Session 3
set transaction isolation level read uncommitted;
-- This reads the inserted data from the 1st session, even before commit
select * from Test;
vonPryz
sumber
Ini semua masuk akal! Saya perlu mencobanya dan kemudian akan menandainya sebagai jawaban. Terima kasih.
Alex
3

Sebagai praktik terbaik, transaksi harus dilakukan sesingkat mungkin dan jangan pernah menunggu interaksi pengguna ; setiap kali Anda melakukan beberapa jenis modifikasi data atau skema dalam suatu transaksi, ini menempatkan kunci pada objek atau baris yang telah disentuh / dimodifikasi, yang membuat kueri pengguna lain menunggu. Ini adalah gilirannya dapat membuat efek berantai yang dapat membuat server database Anda macet.

Dalam skenario yang Anda gambarkan, saya akan merekomendasikan Anda untuk membuat salinan data untuk memisahkan tabel "bagaimana-jika" di mana Anda dapat membuat modifikasi dan meninjau hasilnya. Setelah puas dengan hasilnya, gunakan transaksi untuk menggabungkan data tabel ini kembali ke tabel asli.

Daniel Hutmacher
sumber
Kedengarannya seperti saran yang bagus. Jawaban @vonPryz hanya ingin saya butuhkan saat ini. Saya pikir saran Anda harus menjadi sesuatu yang saya lihat selanjutnya.
Alex