Anda benar:pada tingkat isolasi
standar , read committed
, Anda tidak perlu membungkus pernyataan tertentu dalam transaksi. Pilih pernyataan akan dilindungi dari pembacaan kotor apakah Anda membungkusnya dalam suatu transaksi atau tidak.
connection 1: connection 2:
begin transaction
update user set name = 'Bill' where id = 1
select name from users where id = 1
rollback transaction
Pernyataan pilih tidak akan membaca pembaruan yang dibatalkan:tidak masalah bahwa mereka tidak dibungkus dalam transaksi.
Jika Anda membutuhkan bacaan yang dapat diulang , lalu membungkus pilihan dalam transaksi default tidak membantu:
connection 1: connection 2:
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1
commit transaction
begin
dan commit
pernyataan tidak akan membantu di sini:select
kedua mungkin membaca nama lama, atau mungkin baca nama barunya.
Namun, jika Anda menjalankan pada tingkat isolasi yang lebih tinggi, seperti serializable
atau repeatable read
, grup akan dilindungi dari pembacaan yang tidak dapat diulang:
connection 1: connection 2:
set transaction isolation level
repeatable read
begin transaction
select name from users where id = 1
update user set name = 'Bill' where id = 1
select name from users where id = 1 |
commit transaction |
|--> executed here
Dalam skenario ini, update
akan memblokir sampai transaksi pertama selesai.
Tingkat isolasi yang lebih tinggi jarang digunakan karena mereka menurunkan jumlah orang yang dapat bekerja di database secara bersamaan. Pada level tertinggi, serializable
, kueri pelaporan menghentikan aktivitas pembaruan apa pun.