gpt4 book ai didi

java - spring @Transactional 不起作用?

转载 作者:行者123 更新时间:2023-12-01 16:40:20 24 4
gpt4 key购买 nike

我目前构建了一个使用 spring 作为框架的应用程序。我想使用 spring 测试批量事务。这是我的代码:

public class SqlMapTestDao extends SqlMapClientDaoSupport implements TestDao {

public List<Test> getAllTest() {
return getSqlMapClientTemplate().queryForList("getAllTest");
}

public Test getTest(int param) {
return (Test)getSqlMapClientTemplate().queryForObject("getTest" , param);
}

public void insertTest(Test test) {
getSqlMapClientTemplate().insert("insertTest", test);
}

@Transactional(readOnly = false)
public void insertBatch(List<Test> batch) throws SQLException{
for(Test test : batch) {
getSqlMapClientTemplate().insert("insertTest", test);
}
}
}

我尝试插入与下面相同的主键。

@Autowired
private TestDao testDao;

@RequestMapping(value="/", method=RequestMethod.GET)
public String home(@ModelAttribute Account acc) {

List<Test> test = new ArrayList<Test>();

test.add(new Test(7, "ini empat"));
test.add(new Test(1, "ini satu"));
test.add(new Test(8, "ini lima"));

try {
testDao.insertBatch(test);
}catch (Exception e) {
logger.error("Error", e.getStackTrace());
}

logger.info("Welcome Home");
return "home";
}

当它使用 Id 1 执行时,它会抛出错误,我希望所有查询都会回滚。但有 7 个进入数据库。为什么不能回滚?我哪里错了?

我使用ibatis和mysql作为数据库。

这是 xml 配置:

<!-- Configures transaction management around @Transactional components -->
<tx:annotation-driven transaction-manager="transactionManager" />


<!-- Resource loader for jdbc configuration -->
<context:property-placeholder location="WEB-INF/jdbc.properties"/>

<!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>

<!-- Transaction manager for a single JDBC DataSource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- SqlMap setup for iBATIS Database Layer -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>

<!-- testing purpose -->
<bean id="testDao" class="com.shop.cart.dao.ibatis.SqlMapTestDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>

最佳答案

可能是事务无法正常工作,因为您的 mysql 表不是 InnoDB 类型。

关于java - spring @Transactional 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4383974/

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