【问题标题】:Switch read-only transaction and read-write transaction in google-cloud-spanner-hibernate在 google-cloud-spanner-hibernate 中切换只读事务和读写事务
【发布时间】:2019-12-20 02:51:35
【问题描述】:

我想用google-cloud-spanner-hibernate切换read-write transactionread-only transaction

在 JPA 中,LockMode 是为每个 Query 设置的,但不是为每个 Transaction 设置的。有没有办法在google-cloud-spanner-hibernate中控制它?

【问题讨论】:

  • 当你说“我想用google-cloud-spanner-hibernate切换读写事务和只读事务”时,你能详细说明一下吗?您在此处要求的内容尚不清楚。
  • 好的,我的意思是 1. 是否有任何配置来控制事务模式? 2. 有没有办法在运行时动态切换?
  • 您是在问是否可以在执行期间更改事务的模式?或者您是否在询问在事务执行期间是否正在调用并执行第二个事务,然后执行返回到第一个要完成的事务?请记住,事务是原子的。意味着事务中的所有操作都被执行或根本不执行。

标签: hibernate google-cloud-spanner


【解决方案1】:

我找到了一个解决方案from the Hibernate forums,这可能会有所帮助。如果您使用的是原生 Hibernate,则可以执行以下操作:

Session session = sessionFactory.openSession();
((SessionImplementor)session).connection().setReadOnly(true);
session.setHibernateFlushMode(FlushMode.MANUAL);

session.beginTransaction();

... do your work ...

session.commitTransaction();

这将使底层连接使用只读 Spanner 数据库事务。铸造操作似乎有点不寻常......我会跟进并向 Hibernate 人员询问他们究竟推荐什么,但这至少可以成为一种解决方法。您可以在 Spring HibernateTransactionManager 中看到类似的铸造操作,所以这可能是常见的做法。

如果您使用 Spring,您将可以使用更优雅的方法 - @Transactional(readonly = true) 注释。更多信息here.

【讨论】:

  • 非常感谢!很高兴听到只有转换为 SessionImplementor(即 Hibernate-aware 但不是 Spanner-aware impl)才能做到这一点!
  • 不!如果您需要更多帮助,请随时向 Spanner hibernate dialect repo 提问和发布问题:github.com/GoogleCloudPlatform/google-cloud-spanner-hibernate
猜你喜欢
  • 2021-06-07
  • 2012-03-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多