我在Spring Boot和jpa中使用@Transactional。但这是行不通的。有人可以帮忙吗?
我的插件位于myDAO中,该类在服务类中自动接线。下面的代码是实现服务接口的服务类方法
class MyService implements Service {
@Transactional(rollbackFor = RuntimeException.class)
public ResponseVO createOrder(params) {
myDAO.insertInTable1(param);
myDAO.insertInTable2(param);//I kept wrong table name in this query such that it throws exception
}
}
答案 0 :(得分:3)
问题与MySQL数据库引擎有关。我的引擎是MYIsam,它不支持事务。我将数据库引擎更改为InnoDB及其工作方式。感谢您的贡献。以下是对它们的查询。
选择引擎 从information_schema.TABLES 哪里 TABLE_NAME ='tabel_name' AND TABLE_SCHEMA ='db_name';
ALTER TABLE table_name ENGINE = INNODB;
答案 1 :(得分:1)
尝试一下:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = RuntimeException.class)
希望对您有帮助。
干杯!
答案 2 :(得分:1)
RuntimeException
已被处理
替换为@Transactional(rollbackFor = Exception.class)
以管理所有已检查的异常,并且可以正常工作
答案 3 :(得分:0)
很难从给出的代码量中分辨出来。我知道您不需要rollbackFor
,如果它是RuntimeException
。这些总是回滚。我猜您的表名错误是实现SQLException
的{{1}}。您必须将Exception
设为rollbackFor
,而我只会在验证是否发生回滚时将其保留下来。仅当在服务调用的方法中引发检查异常时,才添加rollbackFor。
答案 4 :(得分:-1)
在Spring Boot中,默认情况下启用OpenSessionInView,因此回滚不起作用,因为每次调用myDAO.insertInTableX()
时,都会执行一次Commit。
因此,要删除此行为并使您的@Transactional
正常运行,请添加以下内容:
spring.jpa.open-in-view=false
转到您的 application.properties
有关更多信息,请参见this question