MyBatis Spring 事务
MyBatis Spring Transactions
我正在尝试正确使用 spring 由 MyBatis
提供的事务管理功能
我正在按以下方式创建 sqlSessionFactor
:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:some/package/**/*.xml" />
<property name="transactionFactory">
<beanclass="org.mybatis.spring.transaction.SpringManagedTransactionFactory" />
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
现在有一个名为 "Programmatic Transaction Management" here 的部分,它获取 transactionManager
的引用并使用此 transactionManager
我们正在做 rollback
或 commit
取决于我们是否有异常。
现在我的问题是,在我的 DAO 层中,我应该明确地做类似
的事情吗?
public class UserDao extends SqlSessionDaoSupport {
PlatformTransactionManager transactionManager; // wired using bean-property
public void insertUser(Integer userId) {
try {
getSqlSession().insert("user-map.insertUser", userId);
} catch (Exception e) {
transactionManager.rollback(txStatus);
throw e;
}
transactionManager.commit(txStatus);
}
}
或者只使用下面的东西(没有编程事务)也将以事务方式执行所有插入。
public class UserDao extends SqlSessionDaoSupport {
public void insertUser(Integer userId) {
getSqlSession().insert("user-map.insertUser", userId);
}
}
我的映射器文件看起来像这样:
<insert id="insertUser" parameterType="HashMap">
<!-- this contains multiple insert queries -->
</insert>
请注意,我在 <insert>...</insert>
中插入了多个内容,我希望它们全部发生或不发生。
This 是我使用的另一个参考。
所以一个普遍的问题是 MyBatis 会围绕我的 <insert>...</insert>
提供自动事务管理还是我必须显式地使用 transactionManager
来实现事务管理特征?
这是您引用的文档中的引述:
MyBatis SqlSession
provides you with specific methods to handle transactions programmatically. But when using MyBatis-Spring your beans will be injected with a Spring managed SqlSession
or a Spring managed mapper. That means that Spring will always handle your transactions.
使用您提供的设置,交易时间跨度完全由 spring 管理,即如果
你使用 declarative transaction management 你不需要额外做任何事情。 Spring 将在您的配置指向的点开始交易。
启用声明式事务管理的简单方法是将其添加到 spring 配置中:
<tx:annotation-driven/>
然后在您的服务方法上使用@Transactional
:
@Service
public class MyService {
@Autowired
private UserDao userDao;
@Transactional
public addUser(User user) {
userDao.insertUser(user);
}
}
您提到的文档中的部分是关于您想要使用程序化事务管理的(极少数)情况。
我正在尝试正确使用 spring 由 MyBatis
提供的事务管理功能我正在按以下方式创建 sqlSessionFactor
:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:some/package/**/*.xml" />
<property name="transactionFactory">
<beanclass="org.mybatis.spring.transaction.SpringManagedTransactionFactory" />
</property>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<constructor-arg ref="dataSource" />
</bean>
现在有一个名为 "Programmatic Transaction Management" here 的部分,它获取 transactionManager
的引用并使用此 transactionManager
我们正在做 rollback
或 commit
取决于我们是否有异常。
现在我的问题是,在我的 DAO 层中,我应该明确地做类似
的事情吗?public class UserDao extends SqlSessionDaoSupport {
PlatformTransactionManager transactionManager; // wired using bean-property
public void insertUser(Integer userId) {
try {
getSqlSession().insert("user-map.insertUser", userId);
} catch (Exception e) {
transactionManager.rollback(txStatus);
throw e;
}
transactionManager.commit(txStatus);
}
}
或者只使用下面的东西(没有编程事务)也将以事务方式执行所有插入。
public class UserDao extends SqlSessionDaoSupport {
public void insertUser(Integer userId) {
getSqlSession().insert("user-map.insertUser", userId);
}
}
我的映射器文件看起来像这样:
<insert id="insertUser" parameterType="HashMap">
<!-- this contains multiple insert queries -->
</insert>
请注意,我在 <insert>...</insert>
中插入了多个内容,我希望它们全部发生或不发生。
This 是我使用的另一个参考。
所以一个普遍的问题是 MyBatis 会围绕我的 <insert>...</insert>
提供自动事务管理还是我必须显式地使用 transactionManager
来实现事务管理特征?
这是您引用的文档中的引述:
MyBatis
SqlSession
provides you with specific methods to handle transactions programmatically. But when using MyBatis-Spring your beans will be injected with a Spring managedSqlSession
or a Spring managed mapper. That means that Spring will always handle your transactions.
使用您提供的设置,交易时间跨度完全由 spring 管理,即如果 你使用 declarative transaction management 你不需要额外做任何事情。 Spring 将在您的配置指向的点开始交易。
启用声明式事务管理的简单方法是将其添加到 spring 配置中:
<tx:annotation-driven/>
然后在您的服务方法上使用@Transactional
:
@Service
public class MyService {
@Autowired
private UserDao userDao;
@Transactional
public addUser(User user) {
userDao.insertUser(user);
}
}
您提到的文档中的部分是关于您想要使用程序化事务管理的(极少数)情况。