事物成功总结
1、内外都无try Catch的时候,外部异常,全部回滚。
2、内外都无try Catch的时候,内部异常,全部回滚。
3、外部有try Catch时候,内部异常,全部回滚
4、内部有try Catch,外部异常,全部回滚
5、友情提示:外层方法中调取其他接口,或者另外开启线程的操作,一定放到最后!!!(因为调取接口不能回滚,一定要最后来处理)
总结:由于上面的异常被捕获导致,很多事务回滚失败。如果一定要将捕获,请捕获后又抛出
RuntimeException(默认为异常捕获RuntimeException)
。
正确的嵌套事物实例
controller层
- package com.ycy.app;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
- import org.springframework.context.annotation.ImportResource;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- /**
- * Created by ycy on 16/7/19.
- */
- @RestController
- @SpringBootApplication
- @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
- @ImportResource({"classpath:/applicationContext.xml"})
- public class Application {
- @Autowired
- private TestBiz testBiz;
- @RequestMapping("/")
- String home() {
- System.out.println("controller 正常执行");
- try {
- testBiz.insetTes();
- } catch (Exception e) {
- System.out.println("controller 异常日志执行");
- }
- return " 正常返回Hello World!";
- }
- public static void main(String[] args) throws Exception {
- SpringApplication.run(Application.class, args);
- }
- }
外层biz层:
- package com.ycy.app;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import org.springframework.transaction.annotation.Transactional;
- import com.ycy.service.TestService;
- /**
- * Created by ycy on 16/7/20.
- */
- @Component
- public class TestBiz {
- @Autowired
- private TestService testService;
- @Transactional
- public void insetTes() throws Exception {
- try {
- for (int j = 0; j < 8; j++) {
- testService.testInsert(j, j + "姓名");
- if (j == 3) {
- int i = 1 / 0;// 此处会产生异常
- }
- }
- } catch (Exception ex) {
- System.out.println("biz层异常日志处理");
- throw new RuntimeException(ex);
- }
- System.out.println("biz层 正常执行");
- }
- }
内层service层
- package com.ycy.service.impl;
- import com.ycy.center.dao.entity.YcyTable;
- import com.ycy.center.dao.mapper.YcyTableMapper;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- /**
- * Created by ycy on 16/7/19.
- */
- @Service
- public class TestServiceImpl implements com.ycy.service.TestService {
- @Autowired
- private YcyTableMapper ycyTableMapper;
- @Transactional
- public void testInsert(int num, String name) throws Exception {
- try {
- YcyTable ycyTable = new YcyTable();
- ycyTable.setName(name);
- ycyTable.setNum(num);
- ycyTableMapper.insert(ycyTable);
- if (num== 3) {
- int i = 1 / 0;// 此处会产生异常
- }
- } catch (Exception ex) {
- System.out.println(num + "service异常日志处理");
- throw new RuntimeException(ex);
- }
- System.out.println(num + "service正常执行");
- }
- }