Transaksi Spanner menawarkan dua mode kontrol konkurensi: pesimis dan optimis. Pilihan mode kontrol konkurensi memengaruhi cara transaksi menangani operasi baca dan tulis serentak, sehingga memengaruhi performa, latensi, dan rasio pembatalan transaksi. Pilih mode yang paling sesuai dengan persyaratan performa dan konsistensi aplikasi Anda.
Perilaku default bergantung pada tingkat isolasi yang digunakan transaksi Anda:
- Isolasi serialisabel menggunakan kontrol konkurensi pesimis secara default.
- Isolasi repeatable read, menggunakan kontrol konkurensi optimis secara default.
Kontrol konkurensi pesimis
Secara default, Spanner menggunakan konkurensi pesimis dengan isolasi serialisabel. Anda juga dapat menggunakan konkurensi pesimis dengan isolasi repeatable read.
Konkurensi pesimis dalam isolasi serialisabel
Mode ini mengasumsikan bahwa transaksi serentak mungkin bersaing untuk data yang sama. Mode ini memperoleh kunci secara proaktif pada data saat dibaca atau ditulis dalam transaksi. Mode ini juga memverifikasi bahwa kunci yang diperoleh sebelumnya dalam transaksi tetap dipertahankan dalam pernyataan berikutnya. Saat Spanner mendeteksi konflik kunci, Spanner akan menggunakan algoritma wound-wait untuk menyelesaikan konflik.
Dalam konkurensi pesimis, transaksi memperoleh kunci pada data selama fase eksekusi dan commit transaksi.
- Untuk operasi baca: Saat transaksi membaca data, transaksi akan memperoleh
kunci baca bersama (
ReaderShared) selama fase eksekusi. Kunci ini dipertahankan hingga transaksi di-commit. - Untuk DML dan operasi tulis:
- Selama eksekusi, untuk data yang diubah oleh DML atau operasi tulis, transaksi mungkin memperoleh kunci baca pada keberadaan baris.
- Pada waktu commit, transaksi mencoba memperoleh kunci tulis atau kunci eksklusif untuk data yang ditulis. Kunci tulis memblokir operasi baca serentak, tetapi mungkin tidak memblokir operasi tulis serentak, terutama saat keduanya menggunakan kunci tulis. Artinya, beberapa transaksi dapat melanjutkan ke commit, dan konflik tulis-tulis diselesaikan pada waktu commit menggunakan algoritma wound-wait. Semua kunci dipertahankan hingga transaksi di-commit.
Konkurensi pesimis dalam isolasi repeatable read
Gunakan konkurensi pesimis dalam isolasi repeatable read untuk membuat serial operasi tulis. Dalam mode ini, operasi baca menggunakan snapshot, tetapi
kunci eksklusif
berlaku untuk data yang dibaca dari FOR UPDATE kueri atau
lock_scanned_ranges=exclusive petunjuk, dan data yang ditulis dengan kueri DML.
Manfaat konkurensi pesimis dengan isolasi serialisabel
Manfaat utama menggunakan konkurensi pesimis dengan isolasi serialisabel adalah, dalam workload yang sangat bersaing, konkurensi ini membantu transaksi membuat progres. Spanner memprioritaskan transaksi yang lebih lama daripada transaksi yang lebih baru selama konflik, sehingga memastikan transaksi akhirnya selesai sekaligus mengurangi jumlah transaksi yang berulang kali dibatalkan.
Manfaat konkurensi pesimis dengan isolasi repeatable read
Dengan isolasi repeatable read, transaksi yang memperoleh kunci mungkin masih dibatalkan pada waktu commit jika data yang dibaca sebagai bagian dari kueri dengan FOR UPDATE atau sebagai bagian dari kueri DML, diubah oleh transaksi serentak sebelum transaksi di-commit. Namun, setelah kunci diperoleh, kunci tersebut mencegah update serentak lebih lanjut hingga transaksi di-commit, sehingga membuat serial operasi tulis.
Risiko konkurensi pesimis
Konkurensi pesimis dengan isolasi serialisabel memiliki risiko berikut:
- Operasi baca yang berjalan lama mungkin memblokir operasi tulis yang sensitif terhadap latensi.
- Transaksi yang melibatkan interaksi pengguna sebelum selesai dapat menyebabkan kunci dipertahankan dalam waktu yang lama, yang berpotensi memblokir operasi lain.
Kasus penggunaan untuk konkurensi pesimis dengan isolasi serialisabel
Konkurensi pesimis cocok untuk workload dengan persaingan baca-tulis dan tulis-tulis yang tinggi. Konkurensi ini juga sesuai jika pembatalan dan percobaan ulang transaksi mahal. Gunakan mode default ini kecuali jika workload Anda memiliki penundaan kunci yang sangat lama, atau sangat terpengaruh oleh konflik kunci.
Kasus penggunaan untuk konkurensi pesimis dengan isolasi repeatable read
Gunakan konkurensi pesimis dengan repeatable read untuk workload yang memerlukan klausa FOR UPDATE atau kueri DML untuk memperoleh kunci. Pendekatan ini sangat berguna untuk workload yang dimigrasikan ke Spanner dari database lain yang memperoleh kunci untuk pernyataan ini.
Kontrol konkurensi optimis
Spanner juga menyediakan kontrol konkurensi optimis. Saat Anda menggunakan isolasi repeatable read, mode defaultnya adalah kontrol konkurensi optimis. Anda juga dapat mengonfigurasi isolasi serialisabel untuk menggunakan kontrol konkurensi optimis.
Kontrol konkurensi optimis mengasumsikan bahwa konflik jarang terjadi. Operasi baca dan kueri, bahkan dalam transaksi baca-tulis, akan dilanjutkan tanpa memperoleh kunci.
Dengan isolasi serialisabel default Spanner, operasi baca divalidasi pada waktu commit. Hal ini memastikan bahwa tidak ada transaksi lain yang di-commit secara serentak yang mengubah data yang sebelumnya dibaca oleh transaksi. Jika Anda menggunakan
isolasi repeatable read,
operasi baca dengan petunjuk FOR UPDATE atau lock_scanned_ranges=exclusive akan
divalidasi pada waktu commit. Jika Spanner mendeteksi konflik, Spanner akan membatalkan transaksi.
Cara kerja konkurensi optimis
Konkurensi optimis mengubah cara Spanner menjalankan operasi baca, kueri, dan transaksi commit. Konkurensi ini melakukan eksekusi tanpa kunci selama fase baca dan memvalidasi konsistensi pada commit.
Untuk operasi baca dan kueri
Operasi baca dan kueri tidak memiliki kunci. Semua operasi baca dan kueri dalam transaksi optimis dieksekusi pada satu stempel waktu snapshot. Spanner memilih stempel waktu ini saat operasi baca atau kueri pertama dieksekusi. Hal ini memastikan bahwa semua operasi baca dan kueri berikutnya dalam transaksi melihat operasi tulis yang di-commit sebelum operasi baca atau kueri pertama.
Untuk operasi baca dan tulis
Untuk transaksi optimis dengan operasi baca dan tulis, Spanner melakukan langkah validasi pada waktu commit. Transaksi berhasil di-commit hanya jika tidak ada konflik yang terdeteksi dan kondisi berikut terpenuhi:
- Tidak ada operasi tulis yang di-commit secara serentak yang berkonflik dengan data yang dibaca oleh transaksi ini; yaitu, tidak ada operasi tulis yang di-commit setelah stempel waktu baca, tetapi sebelum transaksi ini meng-commit operasi tulisnya sendiri.
- Skema tidak diubah sejak stempel waktu baca.
Tingkat isolasi menentukan kumpulan operasi baca yang divalidasi. Dengan isolasi serialisabel, semua operasi baca divalidasi. Dengan isolasi repeatable read, operasi baca dengan petunjuk FOR UPDATE atau lock_scanned_ranges=exclusive akan divalidasi pada waktu commit.
Dalam persaingan yang tinggi, transaksi optimis mungkin berulang kali dibatalkan. Sebaliknya, transaksi pesimis menyelesaikan konflik baca-tulis dengan mengizinkan transaksi yang lebih lama untuk di-commit dan mencoba kembali transaksi yang lebih baru.
Manfaat konkurensi optimis
Konkurensi optimis menawarkan manfaat berikut:
- Operasi baca tidak memperoleh kunci: Transaksi optimis tidak memperoleh kunci untuk operasi baca, sehingga operasi baca yang berjalan lama tidak memblokir operasi tulis yang sensitif terhadap latensi.
- Latensi commit yang lebih rendah untuk transaksi hanya baca: Karena semua operasi baca dalam transaksi optimis didasarkan pada stempel waktu snapshot yang sama, tidak perlu memverifikasi konsistensi selama eksekusi atau commit untuk operasi baca ini, yang secara signifikan mengurangi latensi.
Risiko konkurensi optimis
Konkurensi optimis menimbulkan risiko, terutama dalam persaingan baca-tulis yang tinggi saat digunakan dengan isolasi serialisabel. Pahami risiko ini sebelum Anda menggunakan kontrol konkurensi optimis dengan isolasi serialisabel untuk workload Anda.
- Dalam persaingan baca-tulis yang tinggi, transaksi optimis mungkin mengalami tingkat pembatalan yang tinggi, karena operasi tulis serentak dapat membatalkan operasi baca transaksi optimis.
- Dengan persaingan tinggi yang persisten, transaksi mungkin berulang kali dibatalkan dan tidak pernah di-commit dari kekurangan transaksi.
Kasus penggunaan untuk konkurensi optimis
Konkurensi optimis cocok untuk workload transaksional dengan persaingan baca-tulis yang rendah. Untuk transaksi serialisabel, konkurensi ini juga bermanfaat bagi workload yang dapat menoleransi pembatalan transaksi.
Pertimbangkan konkurensi optimis untuk workload berikut:
- Workload berprioritas rendah dan toleran terhadap latensi dengan transaksi yang berjalan lama: Gunakan konkurensi optimis jika operasi baca atau kueri yang berjalan lama dapat menunda operasi tulis yang sensitif terhadap latensi. Hal ini menghindari penundaan yang disebabkan oleh kunci baca. Misalnya, transaksi di klien seluler dengan koneksi lambat, atau transaksi SLA rendah yang mempertahankan kunci baca untuk banyak baris atau rentang besar.
- Workload transaksional yang sensitif terhadap latensi baca dengan persaingan baca-tulis yang rendah: Dalam konfigurasi multi-region, gunakan konkurensi optimis untuk menayangkan operasi baca secara regional, mengurangi latensi baca, dan menghindari masalah produksi dari traffic baca yang tidak stabil ke pemisahan aktif. Konkurensi ini juga meningkatkan ketersediaan baca selama kelebihan beban atau ketidaktersediaan pemimpin.
- Workload transaksional yang sebagian besar transaksinya hanya baca: Beralih ke konkurensi optimis akan mengurangi latensi commit untuk transaksi hanya baca umum dalam workload ini. Pastikan persaingan baca-tulis rendah untuk menghindari rasio pembatalan yang tinggi untuk transaksi baca-tulis.
Hindari penggunaan konkurensi optimis untuk workload transaksional yang sensitif terhadap latensi dan sering terjadi konflik baca-tulis.
Mengonfigurasi kontrol konkurensi
Anda dapat menggunakan library klien Spanner, REST, dan RPC API untuk menentukan mode konkurensi untuk transaksi baca-tulis.
Library klien
Java
Go
Node.js
Python
C#
C++
REST
Spanner TransactionOptions
REST API menyediakan enum ReadLockMode dalam pesan ReadWrite yang
memungkinkan Anda memilih mode kunci PESSIMISTIC atau OPTIMISTIC.
RPC
Spanner Transactionoptions
RPC API menyediakan enum ReadLockMode dalam pesan ReadWrite yang
memungkinkan Anda memilih mode kunci PESSIMISTIC atau OPTIMISTIC.
Driver
Anda dapat menggunakan driver Spanner untuk menetapkan read_lock_mode sebagai parameter koneksi di tingkat koneksi atau sebagai opsi pernyataan SET di tingkat transaksi. Untuk mengetahui informasi selengkapnya tentang setiap driver, lihat
Ringkasan driver.
Langkah berikutnya
- Pelajari lebih lanjut tentang tingkat isolasi Spanner.
- Pelajari cara menggunakan isolasi repeatable read.