gpt4 book ai didi

java - 按请求的可变事务隔离级别

转载 作者:IT老高 更新时间:2023-10-28 20:54:07 25 4
gpt4 key购买 nike

我正在编写一个小型拍卖应用程序,确保我的出价被准确记录是非常重要的。毕竟,拍卖的最后几秒钟对买家来说是关键时刻,我不能冒险让他们同时竞标和竞争。

当然,这就是事务隔离的用途。我可以将我的隔离级别设置为可序列化,一切就绪。

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

我正在将我的事务级别设置为我的 hibernate 属性 hibernate.connection.isolation 的一部分,但我真的希望能够执行类似 session.setTransactionIsolation(newIsolation ) 每个请求。

最佳答案

如果您使用的是 Spring,则可以使用如下内容:

@Transactional(isolation = Isolation.SERIALIZABLE)

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

因为 JTA 不支持事务范围的隔离级别,所以 Spring 提供了 IsolationLevelDataSourceRouter在使用应用服务器 JTA DataSources 时克服这个缺点。

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

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

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

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

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

使用分离实体时,乐观锁定 6 可以更好地扩展(因为它们是在逻辑事务开始时加载的)。

关于java - 按请求的可变事务隔离级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29633652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com