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

Menerapkan Penguncian Optimis di Oracle

Ada dua pendekatan umum untuk mengunci.

Pertama, Anda memiliki penguncian pesimis. Dalam pendekatan ini, Anda mengunci baris (SELECT ... FOR UPDATE ) yang mencegah orang lain mengubah baris. Kemudian Anda melakukan UPDATE . Saat Anda melakukan perubahan, kunci dilepaskan. Dalam hal ini tidak perlu memiliki kolom nomor versi/stempel waktu (setidaknya tidak mendukung penguncian) dan kodenya relatif mudah.

Kelemahan dari penguncian pesimis adalah Anda harus menahan kunci sepanjang waktu pengguna sedang duduk di halaman yang berpotensi mengedit data. Ini secara teknis sangat sulit jika Anda membuat aplikasi berbasis web karena HTTP adalah protokol tanpa kewarganegaraan. Permintaan yang awalnya membuat halaman biasanya akan mendapatkan koneksi dari kumpulan koneksi, lakukan SELECT , lalu kembalikan koneksi ke kumpulan setelah halaman selesai. Permintaan berikutnya untuk memperbarui data umumnya akan terjadi pada koneksi yang berbeda dengan sesi database yang berbeda sehingga Anda tidak dapat mengunci baris di sesi pertama dan memperbaruinya di sesi kedua. Jika Anda ingin mengunci baris secara pesimis, Anda harus melakukan banyak pekerjaan di bagian belakang untuk memastikan bahwa satu koneksi database diikat ke sesi tingkat menengah tertentu sampai pengguna selesai mengedit data. Ini umumnya memiliki dampak yang sangat negatif pada skalabilitas dan menimbulkan segala macam masalah manajemen sesi-- bagaimana Anda tahu, misalnya, apakah saya meminta halaman, mengunci satu baris, dan kemudian menutup browser saya tanpa pernah keluar atau membuat perubahan? Berapa lama Anda akan membiarkan catatan terkunci di database? Apa yang terjadi jika beberapa sesi lain mencoba mengunci baris? Berapa lama Anda akan membiarkan sesi blok menunggu kunci jika orang pertama pergi makan siang? Umumnya, orang tidak menerapkan penguncian pesimistis di aplikasi berbasis web karena mengelola sesi dan status sesi terlalu tidak praktis.

Opsi kedua adalah penguncian optimis. Dalam pendekatan ini, Anda menambahkan nomor versi/stempel waktu ke baris. Anda memilih nomor versi/stempel waktu ini saat Anda menanyakan data. Kemudian Anda menggunakan ini di WHERE . Anda klausa ketika Anda nanti melakukan pembaruan dan memeriksa berapa banyak baris yang benar-benar diubah. Jika Anda memodifikasi tepat satu baris, Anda tahu bahwa baris tersebut tidak berubah sejak Anda membacanya. Jika Anda memodifikasi 0 baris, Anda tahu bahwa baris tersebut memang berubah dan Anda dapat menangani kesalahannya.

Jadi, misalnya, Anda akan memilih data bersama dengan nomor versi

SELECT address_line1, city, state, zip, version
  FROM addressTable
 WHERE address_id = `<<some key>>`

Ketika Anda siap untuk melakukan pembaruan, Anda akan melakukan sesuatu seperti ini di mana Anda menggunakan version di UPDATE . Anda dan lempar kesalahan jika baris berubah

UPDATE addressTable
   SET address_line1 = `<<new address line 1>>`,
       city = `<<new city>>`,
       state = `<<new state>>`,
       zip = `<<new zip>>`,
       version = version + 1
 WHERE address_id = `<<some key>>`
   AND version = `<<version you read initially>>`

IF( SQL%ROWCOUNT = 0 )
THEN
  -- Darn.  The row must have changed since you read it.  Do something to
  -- alert the user.  Most likely, the application will need to re-query the
  -- data to see what the address has been changed to and then ask the user
  -- whether they want to re-apply the changes.
  RAISE_APPLICATION_ERROR( -20001, 'Oops, the row has changed since you read it.' );
END IF;

Aplikasi Anda kemudian akan melakukan sesuatu yang berguna dengan kesalahan tersebut. Biasanya, itu berarti melakukan sesuatu seperti menanyakan data lagi, menyajikan perubahan kepada pengguna, dan menanyakan apakah mereka masih ingin menerapkan perubahannya. Jika, misalnya, saya membaca sebuah alamat dan mulai mengeditnya, pergi makan siang, rekan kerja saya masuk, membaca alamat yang sama, membuat beberapa pengeditan dan menyimpannya, lalu saya kembali dan mencoba menyimpan perubahan saya, biasanya masuk akal untuk menunjukkan sesuatu yang memberi tahu saya bahwa kolega saya telah mengubah alamat menjadi sesuatu yang baru-- apakah saya ingin melanjutkan pengeditan atau meninggalkannya.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Pro*C/OCI menginstal handler untuk SIGSEGV/SIGABRT dan teman-teman - mengapa, dan bagaimana cara menonaktifkannya?

  2. Bagaimana Cara Memeriksa Tablespace di Oracle SQL Developer?

  3. NULLIF() Fungsi di Oracle

  4. Sisipkan Massal ke dalam database Oracle:Mana yang lebih baik:UNTUK loop kursor atau Select sederhana?

  5. COLLATION() Fungsi di Oracle