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 dijalankan. 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 dan
Client.submit(string)Menggunakan konsol Gremlin dan.
:remote connectMenggunakan HTTP API.
-
Bytecode-based— Permintaan dibuat menggunakan bytecode Gremlin serial khas Gremlin Language Variants (GLV). Misalnya, menggunakan driver Java,
g = traversal().withRemote(....)
Untuk salah satu konteks di atas, ada konteks tambahan dari permintaan yang dikirim sebagai sessionless atau terikat pada sesi.
catatan
Transaksi Gremlin harus selalu dilakukan atau dibatalkan, 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 sessionless, permintaan setara dengan satu transaksi.
Untuk skrip, implikasinya adalah bahwa satu atau lebih pernyataan Gremlin yang dikirim dalam satu permintaan akan melakukan atau mengembalikan sebagai satu transaksi. 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 dieksekusi 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 pada 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 yang disematkan:
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 client.close() melakukan 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. Gremlin Language Variants (GLV) mendukung tx() sintaks Gremlin atau transaksi sebagai berikut: commit() rollback()
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 TinkerPop dokumentasi Apache untuk Java, Python
Awas
Kueri hanya-baca tanpa sesi dijalankan di bawah isolasi SNAPSHOT, tetapi kueri hanya-baca yang dijalankan dalam transaksi eksplisit dijalankan di bawah isolasi SERIALIZABLE. Kueri hanya-baca 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 bytecode dengan tx() sintaks, commit() dan rollback() operasi 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. Pada server, commit() dan rollback() berjalan tanpa batas waktu sampai mereka selesai atau menemukan kesalahan.
Di sisi klien, driver Gremlin tx.commit() dan tx.rollback() panggilan tidak akan selesai sampai server merespons. Bergantung 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 di sekitar fitur transaksi ini.
penting
Jika rollback() panggilan commit() atau membutuhkan waktu lebih lama dari yang diharapkan, itu mungkin diblokir oleh pertentangan kunci dari transaksi bersamaan. Untuk informasi selengkapnya tentang konflik kunci, lihatResolusi Konflik Menggunakan Lock-Wait Timeout.
Jika Anda perlu mengikat 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 hingga selesai. Setelah batas waktu sisi klien, tutup koneksi dan buat yang baru daripada menggunakan kembali koneksi yang ada, karena status transaksi tidak dapat ditentukan.
Pembersihan transaksi sisi server
Jika klien memutuskan atau meninggalkan transaksi tanpa melakukan atau memutar kembali, Neptunus memiliki mekanisme sisi server yang akhirnya membersihkan transaksi yatim piatu:
Waktu tunggu sesi - Sesi berbasis Bytecode yang tetap menganggur lebih lama dari masa pakai sesi maksimum (10 menit) ditutup, dan setiap transaksi terbuka dibatalkan.
Batas waktu idle koneksi - Neptunus menutup WebSocket koneksi yang menganggur selama kurang lebih 20 menit. Ketika koneksi ditutup, server memutar kembali setiap transaksi terbuka yang terkait dengan koneksi itu.
Mekanisme pembersihan ini adalah jaring pengaman. Kami menyarankan Anda untuk selalu melakukan atau memutar kembali transaksi secara eksplisit ketika Anda selesai dengan mereka.