Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mekanisme Penyisipan Basis Data

Secara default Oracle menggunakan tingkat baris kunci.

Kunci ini memblokir hanya untuk penulis (memperbarui, menghapus, menyisipkan dll). Itu berarti pilih akan berfungsi sepanjang waktu ketika tabel diperbarui, dihapus dari, dll.

Misalnya, misalkan tableA(nomor col1, nomor col2), dengan data ini di dalamnya:

col1  |  col2
1     |  10
2     |  20
3     |  30

Jika pengguna John mengeluarkan pada time1 :

update tableA set col2=11 where col1=1;

akan mengunci baris1.

Pada time2 pengguna Tandai mengeluarkan

update tableA set col2=22 where col1=2;

pembaruan akan bekerja, karena baris 2 tidak terkunci.

Sekarang tabel terlihat di database:

col1  |  col2
1     |  11   --locked by john
2     |  22   --locked by mark  
3     |  30

Untuk tabel Mark adalah (dia tidak melihat perubahan yang tidak dikomit)

col1  |  col2
1     |  10   
2     |  22   
3     |  30

Untuk tabel John adalah:(dia tidak melihat perubahan yang tidak dikomit)

col1  |  col2
1     |  11   
2     |  20   
3     |  30

Jika mark mencoba pada time3 :

update tableA set col2=12 where col1=1;

sesinya akan hang sampai time4 ketika John akan mengeluarkan commit .(Kembalikan juga akan membuka kunci baris, tetapi perubahan akan hilang)

tabel adalah (dalam db, pada waktu4):

col1  |  col2
1     |  11   
2     |  22   --locked by mark  
3     |  30

Segera, setelah komit John, baris1 dibuka kuncinya dan pembaruan tanda akan melakukan tugasnya:

col1  |  col2
1     |  12   --locked by mark  
2     |  22   --locked by mark  
3     |  30

mari kita tandai masalah rollbak pada waktu5:

col1  |  col2
1     |  11   
2     |  20   
3     |  30

Kasing penyisipan lebih sederhana, karena baris yang disisipkan dikunci, tetapi juga tidak terlihat oleh pengguna lain karena tidak dikomit. Saat pengguna melakukan, dia juga melepaskan kunci, sehingga pengguna lain dapat melihat baris ini, memperbaruinya, atau menghapusnya.

EDIT :Seperti yang dijelaskan Jeffrey Kemp, ketika Anda memiliki PK (diimplementasikan di Oracle dengan indeks unik), jika pengguna mencoba memasukkan nilai yang sama (jadi, kami akan memiliki duplikat), penguncian akan terjadi di indeks . Sesi kedua akan diblokir hingga sesi pertama berakhir karena mencoba menulis di tempat yang sama. Jika sesi pertama dilakukan, sesi kedua akan membuang pengecualian kunci utama yang dilanggar dan akan gagal mengubah database. Jika sesi pertama melakukan rollback, sesi kedua akan berhasil (jika tidak ada masalah lain yang muncul).

(NB:Dalam penjelasan ini oleh pengguna John yang saya maksud adalah sesi yang dimulai oleh pengguna John.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Efisiensi perhitungan triwulanan jumlah tenaga kerja

  2. Apa sebenarnya trunc(tanggal, 'IW')?

  3. Apache Dbutils mengubah nama kolom dalam pembaruan Sql

  4. Oracle:Cara membuat fungsi yang mengembalikan nilai untuk tab SELECT * FROM WHERE name IN (function())

  5. Menggunakan wildcard dalam pembaruan?