如果我没有使用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.???)
在哪里???可以是这里描述的级别。
- READ_COMMITTED
- READ_UNCOMMITTED
- 可重复读取
- 可序列化的
- 违约
若要设置默认之外的隔离级别,则必须将事务管理器的布尔属性"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();