隔离级别在弹簧启动时不起作用

时间:2017-08-31 18:58:41

标签: database spring hibernate spring-boot transactions

最近我开始使用隔离级别,但是在@Transactional注释中指定隔离级别似乎在spring boot中不起作用。我尝试了很多不同的东西,但我无法让它工作,下面是我的代码。

@Transactional(isolation=Isolation.READ_UNCOMMITTED)
 public  void updateWalletAddresses(List<RegisterWallet>      walletMetaCollection) throws Exception{
    Transaction tx =null;
    Session session =null;
    if(sessionFactory == null){
        return;
    }   
    session = sessionFactory.openSession();     
    try{
       String sql = "select * from user";   

       SQLQuery query = session.createSQLQuery(sql);
       query.addEntity(User.class);
       List<User> userlist=query.list();
       int i=0;
       while(i<userlist.size()){
        System.out.println(userlist.get(i).getEmail());
        i++;
    }

    }catch(Exception e){

        throw e;
    }
}

在执行上述walletservice方法之前,我正在开始一个事务 在mysql客户端,但我没有提交它,所以我有脏数据。 之后我执行了上面的代码,但即使我指定了事务读取未提交,它也不会打印未提交的数据。 在mysql中启动事务的代码是

set autocommit=0;
start transaction;
insert into user (name,email,password,roleid,username) 
values("prashank","myemail@gmail.com","password",1,"prashank");

注意:由于我没有提交事务,因此上面插入会导致脏读问题。我无法读取未提交的数据 注意:类似地,任何其他隔离级别都不起作用。 请帮忙

1 个答案:

答案 0 :(得分:0)

使用

仔细检查您的数据库引擎
SHOW TABLE STATUS LIKE 'table_name';

如果是MyISAM,则不支持事务性, 在下面使用它来创建支持事务的InnoDB,那么您的案例应该可以工作

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect

我也不认为

set autocommit=0;

是必需的bcz启动事务会自动将其禁用