Transaksi Spanner menawarkan dua mode kontrol konkurensi: pesimis dan optimis. Pilihan mode kontrol serentak memengaruhi cara transaksi menangani pembacaan dan penulisan serentak, yang memengaruhi performa, latensi, dan tingkat 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 serializable isolation. Anda juga dapat menggunakan konkurensi pesimistis dengan isolasi repeatable read.
Serentak pesimis dalam isolasi serialisabel
Mode ini mengasumsikan bahwa transaksi serentak dapat bersaing untuk data yang sama. Fitur ini secara proaktif mendapatkan kunci pada data saat dibaca atau ditulis dalam transaksi. Hal ini juga memverifikasi bahwa kunci yang diperoleh sebelumnya dalam transaksi tetap dipegang dalam pernyataan selanjutnya. Saat mendeteksi konflik kunci, Spanner menggunakan algoritma wound-wait untuk menyelesaikan konflik.
Dalam konkurensi pesimis, transaksi memperoleh kunci pada data selama fase eksekusi dan commit transaksi.
- Untuk pembacaan: Saat membaca data, transaksi akan mendapatkan
kunci baca bersama (
ReaderShared) selama fase eksekusi. Kunci ini dipegang hingga transaksi dilakukan. - Untuk DML dan penulisan:
- Selama eksekusi, untuk data yang diubah oleh DML atau operasi tulis, transaksi mungkin mendapatkan kunci baca pada keberadaan baris.
- Pada waktu commit, transaksi mencoba mendapatkan kunci tulis atau eksklusif untuk data yang ditulis. Kunci tulis memblokir pembacaan serentak, tetapi mungkin tidak memblokir penulisan serentak, terutama saat keduanya menggunakan kunci tulis. Artinya, beberapa transaksi dapat dilanjutkan ke commit, dan konflik tulis-tulis diselesaikan pada waktu commit menggunakan algoritma wound-wait. Semua kunci dipegang hingga transaksi dilakukan.
Konkurensi pesimis dalam isolasi repeatable read
Gunakan konkurensi pesimistis dalam isolasi baca yang dapat diulang untuk membuat serialisasi
operasi tulis. Dalam mode ini, operasi baca menggunakan snapshot, tetapi
kunci eksklusif
diterapkan ke data yang dibaca dari kueri FOR UPDATE atau
hint lock_scanned_ranges=exclusive, dan data yang ditulis dengan kueri DML.
Manfaat konkurensi pesimistis dengan isolasi serialisabel
Manfaat utama menggunakan konkurensi pesimis dengan serializable isolation adalah, dalam workload yang sangat bersaing, hal ini membantu transaksi berjalan. Spanner memprioritaskan transaksi lama daripada transaksi baru selama terjadi konflik, sehingga memastikan bahwa transaksi akhirnya selesai sekaligus mengurangi jumlah transaksi yang berulang kali dibatalkan.
Manfaat konkurensi pesimistis dengan isolasi baca yang dapat diulang
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, dimodifikasi oleh transaksi serentak sebelum transaksi di-commit. Namun, setelah kunci diperoleh, hal ini akan mencegah pembaruan serentak lebih lanjut hingga transaksi di-commit, sehingga menserialisasi penulisan.
Risiko serentak pesimis
Konkurensi pesimistis dengan isolasi serialisabel menimbulkan risiko berikut:
- Operasi baca yang berjalan lama dapat memblokir operasi tulis yang sensitif terhadap latensi.
- Transaksi yang melibatkan interaksi pengguna sebelum selesai dapat menyebabkan penguncian ditahan dalam waktu yang lama, yang berpotensi memblokir operasi lain.
Kasus penggunaan untuk konkurensi pesimis dengan isolasi yang dapat diserialisasi
Konkurensi pesimistis cocok untuk workload dengan persaingan baca-tulis dan tulis-tulis yang tinggi. Hal ini juga tepat saat transaksi dibatalkan dan percobaan ulang mahal. Gunakan mode default ini kecuali jika workload Anda memiliki penundaan penguncian panjang yang berlebihan, atau sangat terpengaruh oleh konflik penguncian.
Kasus penggunaan untuk konkurensi pesimis dengan isolasi baca yang dapat diulang
Gunakan konkurensi pesimistis dengan repeatable read untuk beban kerja yang memerlukan klausa
FOR UPDATE atau kueri DML untuk mendapatkan kunci. Pendekatan ini sangat berguna untuk workload yang dimigrasikan ke Spanner dari database lain yang mendapatkan kunci untuk pernyataan ini.
Kontrol konkurensi optimis
Spanner juga menyediakan kontrol serentak optimis. Saat Anda menggunakan isolasi baca yang dapat diulang, mode default adalah kontrol konkurensi optimis. Anda juga dapat mengonfigurasi isolasi yang dapat diserialisasi untuk menggunakan kontrol konkurensi optimis.
Kontrol serentak 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, pembacaan divalidasi pada waktu commit. Hal ini memastikan bahwa tidak ada transaksi lain yang dilakukan secara serentak yang mengubah data yang sebelumnya dibaca oleh transaksi. Jika Anda menggunakan
isolasi baca yang dapat diulang,
baca dengan petunjuk FOR UPDATE atau lock_scanned_ranges=exclusive
divalidasi pada waktu commit. Jika Spanner mendeteksi konflik, Spanner akan membatalkan transaksi.
Cara kerja konkurensi optimis
Konkurensi optimis mengubah cara Spanner menjalankan pembacaan, kueri, dan transaksi commit. Tindakan ini melakukan eksekusi bebas kunci selama fase baca dan memvalidasi konsistensi saat melakukan commit.
Untuk operasi baca dan kueri
Operasi baca dan kueri tidak memerlukan penguncian. Semua pembacaan dan kueri dalam transaksi optimis dieksekusi pada satu stempel waktu snapshot. Spanner memilih stempel waktu ini saat operasi baca atau kueri pertama dijalankan. Hal ini memastikan bahwa semua operasi baca dan kueri berikutnya dalam transaksi melihat operasi tulis yang dilakukan 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 dilakukan hanya jika tidak ada konflik yang terdeteksi dan kondisi berikut terpenuhi:
- Tidak ada penulisan yang di-commit secara serentak yang bertentangan dengan data yang dibaca oleh transaksi ini; artinya, tidak ada penulisan yang di-commit setelah stempel waktu baca tetapi sebelum transaksi ini meng-commit penulisannya sendiri.
- Skema tidak diubah sejak stempel waktu baca.
Tingkat isolasi menentukan kumpulan pembacaan yang divalidasi. Dengan isolasi yang dapat diserialisasi, semua operasi baca divalidasi. Dengan isolasi baca yang dapat diulang,
baca dengan petunjuk FOR UPDATE atau lock_scanned_ranges=exclusive
divalidasi pada waktu commit.
Dalam persaingan yang tinggi, transaksi optimistis mungkin berulang kali dibatalkan. Sebaliknya, transaksi pesimistis menyelesaikan konflik baca-tulis dengan mengizinkan transaksi yang lebih lama untuk di-commit dan mencoba kembali transaksi yang lebih baru.
Manfaat serentak optimis
Optimistic concurrency 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.
- Mengurangi latensi penerapan 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 penerapan 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 serializable isolation. Pahami risiko ini sebelum Anda menggunakan kontrol konkurensi optimis dengan isolasi yang dapat diserialisasi untuk beban kerja Anda.
- Dalam pertentangan baca-tulis yang tinggi, transaksi optimis mungkin mengalami tingkat pembatalan yang tinggi, karena operasi tulis serentak dapat membatalkan pembacaan transaksi optimis.
- Dengan pertentangan tinggi yang persisten, transaksi dapat dibatalkan berulang kali dan tidak pernah dilakukan karena kekurangan transaksi.
Kasus penggunaan untuk konkurensi optimis
Konkurensi optimis cocok untuk workload transaksional dengan persaingan baca-tulis yang rendah. Untuk transaksi yang dapat diserialisasi, fitur ini juga bermanfaat bagi workload yang dapat mentoleransi pembatalan transaksi.
Pertimbangkan konkurensi optimis untuk workload berikut:
- Beban kerja berlatensi toleran dan berprioritas rendah dengan transaksi yang berjalan lama: Gunakan konkurensi optimis jika operasi baca atau kueri yang berjalan lama dapat menunda penulisan 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 menahan kunci baca untuk banyak baris atau rentang besar.
- Beban kerja transaksional yang sensitif terhadap latensi baca dengan persaingan baca-tulis yang rendah: Dalam konfigurasi multi-region, gunakan konkurensi optimis untuk melayani bacaan secara regional, mengurangi latensi baca, dan menghindari masalah produksi dari traffic baca yang melonjak ke pemisahan panas. Hal ini juga meningkatkan ketersediaan baca selama kelebihan beban atau tidak tersedianya pemimpin.
- Workload transaksional dengan sebagian besar transaksi bersifat hanya baca: Beralih ke konkurensi optimis akan mengurangi latensi commit untuk transaksi hanya baca umum dalam workload ini. Pastikan pertentangan baca-tulis rendah untuk menghindari tingkat pembatalan yang tinggi untuk transaksi baca-tulis.
Hindari penggunaan konkurensi optimis untuk beban kerja transaksional yang sensitif terhadap latensi dan sering terjadi konflik baca-tulis.
Mengonfigurasi kontrol konkurensi
Anda dapat menggunakan library klien, REST, dan RPC API Spanner untuk menentukan mode serentak 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 penguncian PESSIMISTIC atau OPTIMISTIC.
RPC
Spanner Transactionoptions
RPC API menyediakan enum ReadLockMode dalam pesan ReadWrite yang
memungkinkan Anda memilih mode penguncian 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 tingkat isolasi Spanner.
- Pelajari cara menggunakan isolasi baca yang dapat diulang.