当前位置: 首页 > 知识库问答 >
问题:

按请求设置的可变事务隔离级别

谭越
2023-03-14

我正在写一个小拍卖app,这是非常重要的,我的出价是有把握的记录。毕竟,拍卖的最后几秒钟是买家的关键时刻,我不能冒险让他们同时出价和竞争。

当然,这就是事务隔离的目的。我可以将我的隔离级别设置为可序列化,然后我们就都设置好了。

但是其他的请求呢?如果用户正在查看配置文件或发送消息,则这些请求不需要任何接近那种事务隔离的地方。对于这些请求,“已提交读”隔离级别是完全可以接受的。

我正在将事务级别设置为hibernate属性hibernate.Connection.Isolation的一部分,但我确实希望能够对每个请求执行类似Session.SetTransactionIsolation(newIsolation)的操作。

共有2个答案

岳君之
2023-03-14

如果您正在使用spring,您可以使用如下内容:

@Transactional(isolation = Isolation.SERIALIZABLE)

它适用于JPatransactionManager。如果您使用的是JtaTransactionManager,则不会传播请求范围事务隔离,因为这是默认的JTA行为。

因为JTA不支持事务范围的隔离级别,所以spring提供了IsolationLevelDataSourceOuter来克服使用application server JTA数据源时的这个缺点。

因为大多数数据源实现只能采用默认的事务隔离级别,所以我们可以有多个这样的数据源,每个数据源都为特定事务隔离级别的连接服务。

逻辑事务(例如@Transactional)隔离级别设置由IsolationLevelDataSourceOuter自省,因此连接获取请求被委托给一个特定的DataSource实现,该实现可以为具有相同事务隔离级别设置的JDBC连接提供服务。

因此,即使在JTA环境中,事务隔离路由器也可以提供独立于供应商的解决方案,用于在每个事务的基础上覆盖默认的数据库隔离级别。

Java EE不支持方法级事务隔离配置。

SERIALIZABLE隔离级别将保护您不受不可重复读取和幻象读取的影响,甚至SERIALIZABLE也不能保护您不受多请求逻辑事务更新丢失的影响。

当使用分离的实体时(当逻辑事务启动时加载它们时),乐观的locking6可以更好地扩展。

梁建德
2023-03-14
Session session = getSession(dataSource, sessionFactory, Connection.TRANSACTION_SERIALIZABLE);

public Session getSession(DataSource dataSource, SessionFactory sessionFactory, int isolationLevel){

  // Get connection from current dataSource and set new isolation
  Connection connectionWithNewIsolation = dataSource.getConnection();
  connectionWithNewIsolation.setTransactionIsolation(isolationLevel);

  // Get session from current sessionFactory with the new isolation
  Session session = sessionFactory.openSession(connectionWithNewIsolation);

  // Hibernate 4.3
  //SessionFactory.openStatelessSession(Connection connection)
  // Hibernate 3.6
  //SessionFactory.openSession(Connection connection)
  //SessionFactory.openStatelessSession(Connection connection)

  return session;
}
 类似资料:
  • 问题内容: 我正在编写一个小小的拍卖应用程序,因此务必要确定我的出价,这一点非常重要。毕竟,拍卖的最后几秒钟对买家来说是关键时刻,我不能冒险让他们同时竞标和拥有比赛条件。 当然,这就是事务隔离的目的。我可以将隔离级别设置为可序列化,并且一切就绪。 但是其他所有请求呢?如果人们正在查看个人资料或发送消息,则这些请求不需要这种事务隔离。对于这些请求,完全可以接受读取的提交隔离级别。 我将事务级别设置为

  • 本文向大家介绍事务的隔离级别有哪些?相关面试题,主要包含被问及事务的隔离级别有哪些?时的应答技巧和注意事项,需要的朋友参考一下 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重

  • 我有一个对具有 SQL API 的 Cosmos 容器的长期运行查询,该查询需要 10 分钟以上才能完成。有没有办法将数据库的隔离级别设置为“可重复读取”或“可序列化”,以避免幻像读取,如这里所定义的那样? 我知道我们可以为 Cosmos DB 设置一致性级别,但它仅适用于地质副本之间的读/写一致性,而不适用于事务隔离。

  • 问题内容: 我想将隔离级别设置为。如何使用gorm orm for postgres实现此目的。 示例代码: 问题答案: 我在这里有完全一样的问题: 和pg完全一样。

  • 本文向大家介绍MySQL的默认事务隔离级别是?相关面试题,主要包含被问及MySQL的默认事务隔离级别是?时的应答技巧和注意事项,需要的朋友参考一下 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复

  • 我将spring应用程序连接到smartbaer servicev,在那里创建了虚拟数据源(Postgres)。 驱动程序类: 连接字符串(本地servicev虚拟服务器url): 应用程序.属性:- spring.datasource.driver-class-name=com.smartbear.servicev.jdbc.driver.jdbcvirtdriver spring.dataso