gpt4 book ai didi

java - MyBatis Spring 事务

转载 作者:行者123 更新时间:2023-11-30 05:24:24 25 4
gpt4 key购买 nike

我正在尝试正确使用 MyBatis 提供的 Spring 事务管理功能

我正在创建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>

现在有一个名为“程序化事务管理”的部分 here其引用 transactionManager并使用这个 transactionManager我们正在做rollbackcommit取决于我们是否有异常(exception)。

现在我的问题是,在我的 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);
}
}

您提到的文档中的部分是关于您想要使用编程式事务管理的(罕见)情况。

关于java - MyBatis Spring 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58957099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com