我有一个类,它有一个标记为@Transactional的方法。从该方法中,会调用多个标记为@Transactional的方法。所以,从层次上讲,这就像有一个父事务和多个子事务。当我调用从数据库获取数据的方法,然后最终调用一个应该将数据存储在数据库中的方法时,就会出现问题,然后事务提交失败,并用“…标记为仅回滚的事务…”标记事务。
代码示例:
甲级
class A{
@Transactional
public void parentMethod(){
B b = B.getB();
C c = c.getC();
D d = new D();
d.setB(b);
d.setC(c);
service.save(d);
}
}
B类
class B{
@Transactional
public B getB(){
repository.getById(xxx);
}
}
C类
class C{
@Transactional
public C getC(){
repository.getById(xxx);
}
}
服务
@Transactional
public D save(D d){
repository.save(d);
}
正如您在上面的代码中看到的,当我调用方法
service.save(d);
时,我得到了“...标记为仅回滚的事务...
”异常。但是,如果我像这样注释所有“get”子事务
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
我得到了预期的结果,例如,事务被正确提交,没有异常发生。
注意:在我的真实示例中,我有多个“save();”方法和多个“get();”最后一个“save();”之前的方法方法
编辑:看看这个问题:为什么从数据库中获取数据和插入数据在同一个“父”事务中不起作用?
这与这个问题有关。但这个问题仍然存在。
传播REQUIRES_NEW:不要使用它,因为它会创建一个新事务,如果存在,则会暂停当前事务。
使用@Transaction的默认配置:传播。必需支持当前事务,如果不存在,则创建一个新事务。
使用spring4@transactional和jdbctemplate时事务不起作用!!请帮帮我 application.xml 代理创建失败?
我在下面的代码中使用了Spring的@Transactional注释和JDBC模板,它不回滚事务。我使用了随机文件名和表名。我正在尝试删除外键id的行,然后在名为“data”的数据库表中插入相同id的记录。但是当我测试的时候,我发现如果插入中有错误,删除就不会被回滚。我对Spring还是个新手,如果有任何帮助,我将不胜感激。 testRepository.java database.xml
我有一个eventhandler方法,它被注释为@Transactional,这个方法在同一个类中调用一个事件的实现。 此事件执行一些检查,根据结果,它将执行某些操作,或者更改状态并抛出RuntimeException。 status change方法在另一个类中,并且该方法用@transactional(propagation=propagation.requires_new)注释。 我预计,由
我正在使用Guice注入EntityManager。当我提交注入实体管理器的操作时,BD端没有发生任何事情:没有事务通过!!!你能帮我弄清楚发生了什么吗? 这是我的代码: 网状物xml Inject torListener类: 持久性模块类: GuiceModule类: RestModule类: 公共类RestModule扩展了JerseyServletModule{ 最后是网络服务(jeresy
@Transactional标记是最近添加的。所以不确定它是否像预期的那样工作。 代码: 服务类别:
我对事务REST控制器中的一些异常处理感到困惑。 我有一个管理服务,看起来像: 我有一个REST控制器,看起来像: 它使用@Transactional(readOnly = true)注释。 如果存在此注释并且没有找到搜索的项目,则它会给出以下异常: 如果删除注释,则一切正常,响应包含搜索的项。 我假设当没有找到搜索的条目时会抛出一个异常,触发事务回滚消息。 以下是异常处理程序: 有没有办法在日志