如何在春季将事务设置在最低级别,类似于jdbc



如果我没有使用hibernate,我会使用jdbcTemplate进行一个数据库调用,比如:

getJdbcTemplate().update("....")

我以前也这样做过,我没有为事务编写任何xmlbean配置或使用任何注释。那么我当时的交易范围是什么呢?

目前,当在hibernate中使用springmvc时,我正在注入sessionManager(不使用hibernate DaoSupport),并在我的服务类(使用Dao)上添加@Transaction注释。

@Service
@Transactional
public class UserServiceImpl extends UserService {
   @Autowired
   UserService userService
   @Override
   public User getUser(int id) {
       return userDao.get(User.class, id);
   }
}

我的应用程序上下文XML有:

<context:component-scan base-package="com.myapp"/>
<mvc:annotation-driven/>
<bean id="dataSource" .../>
<bean id="sessionFactory" .../>
<tx:annotation-driven />

在这一点上,我真的不在乎跨越单个数据库调用的事务,我希望事情尽可能快。

我如何才能做到JdbcTemplate所做的?

当涉及到事务时,有哪些不同的选项,特别是寻找尽可能减少表/行锁定的方法(我猜我想要的是jdbcTemplate为我开箱即用做的)。

当您在不指定任何隔离级别的情况下使用@Transactional时,它将默认为底层数据存储的默认隔离级别。jdbc和hibernate都是如此。

如果要更改隔离级别,则必须在@Transactional中提供隔离枚举。

@Transactional(isolation=Isolation.???)

在哪里???可以是这里描述的级别。

  1. READ_COMMITTED
  2. READ_UNCOMMITTED
  3. 可重复读取
  4. 可序列化的
  5. 违约

若要设置默认之外的隔离级别,则必须将事务管理器的布尔属性"allowCustomIsolationLevels"设置为true(如果使用JTA事务)。

您可以参考更多关于@Transactional 的spring文档中的设置

关于"尽可能快",我使用无状态会话回答了这类问题:

在hibernate 中插入大量记录的最佳方式

基本上(我从上面问题的答案中复制/粘贴我的代码):

Session session = sessionFactory.openStatelessSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Item item = new Item(...);
    session.save(item);
    if ( i % 100 == 0 ) {
        session.flush();
        session.clear(); // not needed ? (see below)
    }
}
tx.commit();
session.close();

最新更新