View a markdown version of this page

Transaksi Gremlin di Neptunus - Amazon Neptune

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Transaksi Gremlin di Neptunus

Ada beberapa konteks di mana transaksi Gremlin dieksekusi. Saat bekerja dengan Gremlin, penting untuk memahami konteks tempat Anda bekerja dan apa implikasinya:

  • Script-based— Permintaan dibuat menggunakan string Gremlin berbasis teks, seperti ini:

    • Menggunakan driver Java danClient.submit(string).

    • Menggunakan konsol Gremlin dan. :remote connect

    • Menggunakan HTTP API.

  • Bytecode-based— Permintaan dibuat menggunakan bytecode Gremlin serial khas Gremlin Language Variants (GL V).

    Misalnya, menggunakan driver Java,g = traversal().withRemote(...).

Untuk salah satu konteks di atas, ada konteks tambahan permintaan yang dikirim sebagai tanpa sesi atau terikat ke sesi.

catatan

Transaksi Gremlin harus selalu dilakukan atau diputar kembali, sehingga sumber daya sisi server dapat dilepaskan. Jika terjadi kesalahan selama transaksi, penting untuk mencoba kembali seluruh transaksi dan bukan hanya permintaan tertentu yang gagal.

Permintaan tanpa sesi

Ketika tanpa sesi, permintaan setara dengan satu transaksi.

Untuk skrip, implikasinya adalah bahwa satu atau lebih pernyataan Gremlin yang dikirim dalam satu permintaan akan melakukan komit atau rollback sebagai transaksi tunggal. Contoh:

Cluster cluster = Cluster.open(); Client client = cluster.connect(); // sessionless // 3 vertex additions in one request/transaction: client.submit("g.addV();g.addV();g.addV()").all().get();

Untuk bytecode, permintaan tanpa sesi dibuat untuk setiap traversal yang muncul dan dijalankan dari: g

GraphTraversalSource g = traversal().withRemote(...); // 3 vertex additions in three individual requests/transactions: g.addV().iterate(); g.addV().iterate(); g.addV().iterate(); // 3 vertex additions in one single request/transaction: g.addV().addV().addV().iterate();

Permintaan terikat ke sesi

Ketika terikat ke sesi, beberapa permintaan dapat diterapkan dalam konteks satu transaksi.

Untuk skrip, implikasinya adalah bahwa tidak perlu menggabungkan semua operasi grafik menjadi satu nilai string tertanam:

Cluster cluster = Cluster.open(); Client client = cluster.connect(sessionName); // session try { // 3 vertex additions in one request/transaction: client.submit("g.addV();g.addV();g.addV()").all().get(); } finally { client.close(); } try { // 3 vertex additions in three requests, but one transaction: client.submit("g.addV()").all().get(); // starts a new transaction with the same sessionName client.submit("g.addV()").all().get(); client.submit("g.addV()").all().get(); } finally { client.close(); }

Untuk sesi berbasis skrip, menutup klien dengan melakukan client.close() transaksi. Tidak ada perintah rollback eksplisit yang tersedia dalam sesi berbasis skrip. Untuk memaksa rollback, Anda dapat menyebabkan transaksi gagal dengan mengeluarkan kueri seperti g.inject(0).fail('rollback') sebelum menutup klien.

catatan

Kueri sepertig.inject(0).fail('rollback'), digunakan untuk sengaja melempar kesalahan untuk memaksa rollback, menghasilkan pengecualian pada klien. Tangkap dan buang pengecualian yang dihasilkan sebelum menutup klien.

Untuk bytecode, transaksi dapat dikontrol secara eksplisit dan sesi dikelola secara transparan. Varians Bahasa Gremlin (GLV) mendukung tx() sintaks Gremlin ke commit() atau rollback() transaksi sebagai berikut:

GraphTraversalSource g = traversal().withRemote(conn); Transaction tx = g.tx(); // Spawn a GraphTraversalSource from the Transaction. // Traversals spawned from gtx are executed within a single transaction. GraphTraversalSource gtx = tx.begin(); try { gtx.addV('person').iterate(); gtx.addV('software').iterate(); tx.commit(); } finally { if (tx.isOpen()) { tx.rollback(); } }

Meskipun contoh di atas ditulis dalam Java, Anda juga dapat menggunakan tx() sintaks ini dalam bahasa lain. Untuk sintaks transaksi khusus bahasa, lihat bagian Transaksi dari TinkerPop dokumentasi Apache untuk Java, Python, Javascript, .NET , dan Go.

Awas

Kueri read-only tanpa sesi dijalankan di bawah isolasi SNAPSHOT, tetapi kueri read-only yang dijalankan dalam transaksi eksplisit dijalankan di bawah isolasi SERIALIZABLE. Definisi Tingkat Isolasi Kueri read-only yang dijalankan di bawah SERIALIZABLE isolasi menimbulkan overhead yang lebih tinggi dan dapat memblokir atau diblokir oleh penulisan bersamaan, tidak seperti yang dijalankan di bawah isolasi. SNAPSHOT

Perilaku batas waktu untuk komit dan rollback bytecode

Bila Anda menggunakan transaksi berbasis byte dengan sin tx() taks, rollback() operasi commit() dan tidak tunduk pada pengaturan batas waktu kueri. Baik neptune_query_timeout parameter global maupun nilai batas waktu per kueri yang ditetapkan tidak evaluationTimeout berlaku untuk operasi ini. Di server, commit() dan rollback() jalankan tanpa batas waktu sampai mereka selesai atau mengalami kesalahan.

Di sisi klien, driver tx.commit() dan tx.rollback() panggilan Gremlin tidak akan selesai sampai server merespons. Tergantung pada bahasanya, ini mungkin bermanifestasi sebagai panggilan pemblokiran atau operasi asinkron yang belum terselesaikan. Tidak ada driver yang menyediakan pengaturan batas waktu bawaan yang membatasi panggilan ini. Lihat dokumentasi API untuk Varian Bahasa Gremlin spesifik Anda untuk detail tentang perilaku konkurensi seputar fitur transaksi ini.

penting

Jika rollback() panggilan commit() atau membutuhkan waktu lebih lama dari yang diharapkan, panggilan tersebut mungkin diblokir oleh pertentangan kunci dari transaksi bersamaan. Untuk informasi selengkapnya tentang konflik kunci, lihatResolusi Konflik Menggunakan Lock-Wait Timeout.

Jika Anda perlu membatasi waktu aplikasi Anda menunggu commit() ataurollback(), Anda dapat menggunakan fitur konkurensi bahasa Anda untuk menerapkan batas waktu sisi klien. Jika batas waktu sisi klien diaktifkan, server terus memproses operasi. Operasi sisi server menahan thread pekerja sampai selesai. Setelah batas waktu sisi klien, tutup koneksi dan buat yang baru daripada menggunakan kembali koneksi yang ada, karena status transaksi tidak pasti.

Server-side pembersihan transaksi

Jika klien memutuskan atau meninggalkan transaksi tanpa melakukan atau memutar kembali, Neptunus memiliki mekanisme sisi server yang pada akhirnya membersihkan transaksi yatim piatu:

  • Masa tunggu sesi — Bytecode-based sesi yang tetap tidak aktif lebih lama dari masa pakai sesi maksimum (10 menit) ditutup, dan setiap transaksi terbuka akan dibatalkan.

  • Waktu tunggu koneksi idle - Neptunus menutup WebSocket koneksi yang tidak aktif selama sekitar 20 menit. Ketika koneksi ditutup, server akan mengembalikan transaksi terbuka apa pun yang terkait dengan koneksi itu.

Mekanisme pembersihan ini adalah jaring pengaman. Kami menyarankan agar Anda selalu secara eksplisit melakukan atau membatalkan transaksi ketika Anda selesai melakukannya.