Heim  >  Fragen und Antworten  >  Hauptteil

Problem mit dem Rollback der Spring-Transaktion

Spring-Dinge, injizieren Sie Dinge in die Service-Schicht, führen Sie zwei Einfügevorgänge aus. Müssen Sie selbst eine Ausnahme in der Service-Methode auslösen und dann ein Rollback angeben? Oder wird eine Einfügung zurückgesetzt, ohne eine Ausnahme auszulösen, wenn sie fehlschlägt?
Hier wird die Proxy-Dao-Implementierung von mybatis verwendet. Wird eine Eingabeaufforderung oder eine Ausnahme ausgelöst, wenn das Einfügen fehlschlägt?

漂亮男人漂亮男人2686 Tage vor894

Antworte allen(4)Ich werde antworten

  • 怪我咯

    怪我咯2017-06-12 09:26:47

    使用@Transaction(rollbackFor=Throwable.class)注解到Service类上或具体的方法上,需要注意的是@Transaction注解默认只对RuntimeException异常捕获并回滚,也就是说如果你抛出的是Exception异常将不进行回滚,所以要记得加上rollbackFor=Throwable.class指定所有的异常都进行回滚

    Antwort
    0
  • 高洛峰

    高洛峰2017-06-12 09:26:47

    同意@正能量前线的答案,并且补充下,如果在一个方法中进行多次操作,需要考虑事务的传播范围,当然默认是 propagation = Propagation.REQUIRED,意思是说: 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.

    Antwort
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-12 09:26:47

    如果有编译异常抛出就可以 不可以自己捕获处理 你既然用了spring框架 ,自己捕获并处理了异常,框架不会帮你回滚了,前提是你在spring配置文件里边配置了事务的回滚策略同意一楼所说默认运行异常回滚,事务是加在service层的,你那两个insert方法本身并没有事务,所以不需要考虑传播行为。

    Antwort
    0
  • 淡淡烟草味

    淡淡烟草味2017-06-12 09:26:47

    看了前面前面两位的回答,我再补充下。在Spring事务默认是基于接口的JDK代理。所以在你的Service层调用的两个insert方法,如果insert也是service层方法,那必须是接口方法,如果是私有方法,则私有方法不会回滚。还要注意多线程情况下的事务问题。

    Antwort
    0
  • StornierenAntwort