View a markdown version of this page

Transaksi di Neptunus OpenCypher - Amazon Neptune

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

Transaksi di Neptunus OpenCypher

Implementasi OpenCypher di Amazon Neptune menggunakan semantik transaksi yang ditentukan oleh Neptunus Namun, tingkat isolasi yang disediakan oleh driver Bolt memiliki beberapa implikasi khusus untuk semantik transaksi Bolt, seperti yang dijelaskan pada bagian di bawah ini.

Read-only Kueri transaksi Bolt

Ada berbagai cara agar kueri read-only dapat diproses, dengan model transaksi dan tingkat isolasi yang berbeda, sebagai berikut:

Kueri transaksi baca-saja implisit

Berikut adalah contoh transaksi implisit read-only:

public void executeReadImplicitTransaction() { // end point final String END_POINT = "(End Point URL)"; // read query final String READ_QUERY = "MATCH (n) RETURN n limit 10"; // create the driver final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(), Config.builder().withEncryption() .withTrustStrategy(TrustStrategy.trustSystemCertificates()) .build()); // create the session config SessionConfig sessionConfig = SessionConfig.builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.READ) .build(); // run the query as access mode read driver.session(sessionConfig).readTransaction(new TransactionWork<String>() { final StringBuilder resultCollector = new StringBuilder(); @Override public String execute(final Transaction tx) { // execute the query Result queryResult = tx.run(READ_QUERY); // Read the result for (Record record : queryResult.list()) { for (String key : record.keys()) { resultCollector.append(key) .append(":") .append(record.get(key).asNode().toString()); } } return resultCollector.toString(); } } ); // close the driver. driver.close(); }

Karena replika baca hanya menerima kueri read-only, semua kueri terhadap replika baca dijalankan sebagai transaksi implisit baca terlepas dari mode akses yang ditetapkan dalam konfigurasi sesi. Neptunus mengevaluasi transaksi baca-implisit sebagai kueri baca-saja di bawah semantik isolasi. SNAPSHOT

Jika terjadi kegagalan, transaksi baca-implisit dicoba ulang secara default.

Kueri transaksi baca-saja komit otomatis

Berikut adalah contoh transaksi autocommit baca-saja:

public void executeAutoCommitTransaction() { // end point final String END_POINT = "(End Point URL)"; // read query final String READ_QUERY = "MATCH (n) RETURN n limit 10"; // Create the session config. final SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.READ) .build(); // create the driver final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(), Config.builder() .withEncryption() .withTrustStrategy(TrustStrategy.trustSystemCertificates()) .build()); // result collector final StringBuilder resultCollector = new StringBuilder(); // create a session final Session session = driver.session(sessionConfig); // run the query final Result queryResult = session.run(READ_QUERY); for (final Record record : queryResult.list()) { for (String key : record.keys()) { resultCollector.append(key) .append(":") .append(record.get(key).asNode().toString()); } } // close the session session.close(); // close the driver driver.close(); }

Jika mode akses diatur ke READ dalam konfigurasi sesi, Neptune mengevaluasi kueri transaksi komit otomatis sebagai kueri baca-saja di bawah SNAPSHOT semantik isolasi. Perhatikan bahwa replika baca hanya menerima kueri read-only.

Jika Anda tidak meneruskan konfigurasi sesi, kueri komit otomatis diproses secara default dengan isolasi kueri mutasi, jadi penting untuk meneruskan konfigurasi sesi yang secara eksplisit menetapkan mode akses keREAD.

Jika terjadi kegagalan, kueri komit otomatis baca-saja tidak dicoba ulang.

Kueri transaksi baca-saja eksplisit

Berikut adalah contoh transaksi read-only eksplisit:

public void executeReadExplicitTransaction() { // end point final String END_POINT = "(End Point URL)"; // read query final String READ_QUERY = "MATCH (n) RETURN n limit 10"; // Create the session config. final SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.READ) .build(); // create the driver final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(), Config.builder() .withEncryption() .withTrustStrategy(TrustStrategy.trustSystemCertificates()) .build()); // result collector final StringBuilder resultCollector = new StringBuilder(); // create a session final Session session = driver.session(sessionConfig); // begin transaction final Transaction tx = session.beginTransaction(); // run the query on transaction final List<Record> list = tx.run(READ_QUERY).list(); // read the result for (final Record record : list) { for (String key : record.keys()) { resultCollector .append(key) .append(":") .append(record.get(key).asNode().toString()); } } // commit the transaction and for rollback we can use beginTransaction.rollback(); tx.commit(); // close the driver driver.close(); }

Jika mode akses diatur ke READ dalam konfigurasi sesi, Neptunus mengevaluasi transaksi baca-saja eksplisit sebagai ku eri baca-saja di bawah semantik isolasi. SNAPSHOT Perhatikan bahwa replika baca hanya menerima kueri read-only.

Jika Anda tidak meneruskan konfigurasi sesi, transaksi baca-saja eksplisit diproses secara default dengan isolasi kueri mutasi, jadi penting untuk meneruskan konfigurasi sesi yang secara eksplisit menetapkan mode akses ke. READ

Jika terjadi kegagalan, kueri eksplisit baca-saja dicoba ulang secara default.

Kueri transaksi Mutasi Bolt

Seperti kueri read-only, ada berbagai cara kueri mutasi dapat diproses, dengan model transaksi dan tingkat isolasi yang berbeda, sebagai berikut:

Kueri transaksi mutasi implisit

Berikut adalah contoh transaksi mutasi implisit:

public void executeWriteImplicitTransaction() { // end point final String END_POINT = "(End Point URL)"; // create node with label as label and properties. final String WRITE_QUERY = "CREATE (n:label {name : 'foo'})"; // Read the vertex created with label as label. final String READ_QUERY = "MATCH (n:label) RETURN n"; // create the driver final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(), Config.builder() .withEncryption() .withTrustStrategy(TrustStrategy.trustSystemCertificates()) .build()); // create the session config SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.WRITE) .build(); final StringBuilder resultCollector = new StringBuilder(); // run the query as access mode write driver.session(sessionConfig).writeTransaction(new TransactionWork<String>() { @Override public String execute(final Transaction tx) { // execute the write query and consume the result. tx.run(WRITE_QUERY).consume(); // read the vertex written in the same transaction final List<Record> list = tx.run(READ_QUERY).list(); // read the result for (final Record record : list) { for (String key : record.keys()) { resultCollector .append(key) .append(":") .append(record.get(key).asNode().toString()); } } return resultCollector.toString(); } }); // at the end, the transaction is automatically committed. // close the driver. driver.close(); }

Pembacaan yang dibuat sebagai bagian dari kueri mutasi dijalankan di bawah READ COMMITTED isolasi dengan jaminan biasa untuk transaksi mutasi Neptunus.

Apakah Anda secara khusus meneruskan konfigurasi sesi atau tidak, transaksi selalu diperlakukan sebagai transaksi tulis.

Untuk konflik, lihatResolusi Konflik Menggunakan Lock-Wait Timeout.

Kueri transaksi mutasi komit otomatis

Kueri komit otomatis mutasi mewarisi perilaku yang sama dengan transaksi implisit mutasi.

Jika Anda tidak meneruskan konfigurasi sesi, transaksi diperlakukan sebagai transaksi tulis secara default.

Jika terjadi kegagalan, kueri komit otomatis mutasi tidak dicoba ulang secara otomatis.

Kueri transaksi mutasi eksplisit

Berikut adalah contoh transaksi mutasi eksplisit:

public void executeWriteExplicitTransaction() { // end point final String END_POINT = "(End Point URL)"; // create node with label as label and properties. final String WRITE_QUERY = "CREATE (n:label {name : 'foo'})"; // Read the vertex created with label as label. final String READ_QUERY = "MATCH (n:label) RETURN n"; // create the driver final Driver driver = GraphDatabase.driver(END_POINT, AuthTokens.none(), Config.builder() .withEncryption() .withTrustStrategy(TrustStrategy.trustSystemCertificates()) .build()); // create the session config SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.WRITE) .build(); final StringBuilder resultCollector = new StringBuilder(); final Session session = driver.session(sessionConfig); // run the query as access mode write final Transaction tx = driver.session(sessionConfig).beginTransaction(); // execute the write query and consume the result. tx.run(WRITE_QUERY).consume(); // read the result from the previous write query in a same transaction. final List<Record> list = tx.run(READ_QUERY).list(); // read the result for (final Record record : list) { for (String key : record.keys()) { resultCollector .append(key) .append(":") .append(record.get(key).asNode().toString()); } } // commit the transaction and for rollback we can use tx.rollback(); tx.commit(); // close the session session.close(); // close the driver. driver.close(); }

Kueri mutasi eksplisit mewarisi perilaku yang sama dengan transaksi mutasi implisit.

Jika Anda tidak meneruskan konfigurasi sesi, transaksi diperlakukan sebagai transaksi tulis secara default.

Untuk konflik, lihatResolusi Konflik Menggunakan Lock-Wait Timeout.