首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改隔离级别- hibernate.connection.isolation不工作

更改隔离级别- hibernate.connection.isolation不工作
EN

Stack Overflow用户
提问于 2017-10-16 00:25:23
回答 1查看 1.9K关注 0票数 2

我使用spring引导,并希望将默认的隔离级别更改为READ_UNCOMMITTED

我搜索并找到了属性hibernate.connection.isolation,但我尝试了它,但它没有工作。

我的配置如下:

代码语言:javascript
复制
private Properties additionalJpaProperties() {
        Properties properties = new Properties();

        properties.setProperty("hibernate.hbm2ddl.auto", "validate");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.SQLServerDialect");
        properties.setProperty("hibernate.connection.isolation", String.valueOf(Connection.TRANSACTION_READ_UNCOMMITTED));

        return properties;
    }

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) throws SQLException {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        em.setPackagesToScan(this.packages);
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(this.additionalJpaProperties());
        return em;
    }

如何使用spring引导更改隔离级别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-25 11:50:48

如果有人需要解决的话。我找到的唯一解决办法是:

扩展HibernateJpaDialect类并实现beginTransaction方法来设置事务隔离。看起来是这样的:

代码语言:javascript
复制
@Service
public class CustomHibernateJpaDialect extends HibernateJpaDialect {

    @Override
    public Object beginTransaction(final EntityManager entityManager,
            final TransactionDefinition definition) throws PersistenceException,
            SQLException, TransactionException {

        Session session = getSession(entityManager);

        if (definition.getTimeout() != TransactionDefinition.TIMEOUT_DEFAULT) {
            session.getTransaction().setTimeout(definition.getTimeout());
        }

        entityManager.getTransaction().begin();

        session.doWork(new Work() {
            public void execute(Connection connection) throws SQLException {
                DataSourceUtils.prepareConnectionForTransaction(connection, definition);
                connection.setTransactionIsolation(TransactionDefinition.ISOLATION_READ_UNCOMMITTED);
            }
        });

        return prepareTransaction(entityManager, definition.isReadOnly(), definition.getName());
    }

}

在entityManagerFactory的配置中,有必要设置所创建的方言:

代码语言:javascript
复制
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            DataSource dataSource,
            CustomHibernateJpaDialect customHibernateJpaDialect) throws SQLException {

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();

        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaDialect(customHibernateJpaDialect);

        return em;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46761383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档