使用显式事务模式进行读写 - Amazon Neptune

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用显式事务模式进行读写

在将事务与 Neptune 和 Bolt 驱动程序结合使用时,最好将读取和写入事务的访问模式显式设置为正确的设置。

只读事务

对于只读事务,如果您在构建会话时没有传入适当的访问模式配置,则使用默认的隔离级别,即突变查询隔离。因此,对于只读事务来说,将访问模式显式设置为 read 非常重要。

自动提交读取事务示例:

SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.READ) .build(); Session session = driver.session(sessionConfig); try { (Add your application code here) } catch (final Exception e) { throw e; } finally { driver.close() }

读取事务示例:

Driver driver = GraphDatabase.driver(url, auth, config); SessionConfig sessionConfig = SessionConfig .builder() .withDefaultAccessMode(AccessMode.READ) .build(); driver.session(sessionConfig).readTransaction( new TransactionWork<List<String>>() { @Override public List<String> execute(org.neo4j.driver.Transaction tx) { (Add your application code here) } } );

在这两种情况下,都使用 Neptune 只读事务语义实现 SNAPSHOT 隔离

由于只读副本仅接受只读查询,因此提交到只读副本的任何查询都在 SNAPSHOT 隔离语义下运行。

只读事务没有脏读或不可重复读取。

只读事务

对于突变查询,有三种不同的机制可以创建写入事务,每种机制如下所示:

隐式写入事务示例:

Driver driver = GraphDatabase.driver(url, auth, config); SessionConfig sessionConfig = SessionConfig .builder() .withDefaultAccessMode(AccessMode.WRITE) .build(); driver.session(sessionConfig).writeTransaction( new TransactionWork<List<String>>() { @Override public List<String> execute(org.neo4j.driver.Transaction tx) { (Add your application code here) } } );

自动提交写入事务示例:

SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.Write) .build(); Session session = driver.session(sessionConfig); try { (Add your application code here) } catch (final Exception e) { throw e; } finally { driver.close() }

显式写入事务示例:

Driver driver = GraphDatabase.driver(url, auth, config); SessionConfig sessionConfig = SessionConfig .builder() .withFetchSize(1000) .withDefaultAccessMode(AccessMode.WRITE) .build(); Transaction beginWriteTransaction = driver.session(sessionConfig).beginTransaction(); (Add your application code here) beginWriteTransaction.commit(); driver.close();
写入事务的隔离级别
  • 作为突变查询的一部分进行的读取是在 READ COMMITTED 事务隔离下运行的。

  • 对于作为突变查询一部分进行的读取,没有脏读。

  • 在突变查询中读取时,记录和记录范围会被锁定。

  • 当突变事务已读取索引范围时,可以强力保证在读取结束之前,任何并发事务都不会修改该范围。

突变查询不是线程安全的。

有关冲突,请参阅使用锁定等待超时解决冲突

突变查询失败时不会自动重试。