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 baca yang dapat diulang, menggunakan kontrol konkurensi optimis secara default.
Kontrol konkurensi pesimis
Secara default, Spanner menggunakan konkurensi pesimis dengan serializable isolation. Mode ini mengasumsikan bahwa transaksi serentak mungkin 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.
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 dibatalkan berulang kali.
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 kunci dipertahankan dalam waktu yang lama, sehingga berpotensi memblokir operasi lain.
Kasus penggunaan untuk konkurensi pesimis
Konkurensi pesimistis cocok untuk beban kerja 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.
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 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, 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. Layanan 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 pertentangan yang tinggi, transaksi optimistis mungkin berulang kali dibatalkan. Sebaliknya, transaksi pesimistis menyelesaikan konflik baca-tulis dengan mengizinkan transaksi yang lebih lama 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 diserialkan 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#
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.