中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java spring嵌套事務和事務傳播類型怎么理解

發布時間:2021-12-16 09:39:51 來源:億速云 閱讀:268 作者:iii 欄目:編程語言

本篇內容主要講解“java spring嵌套事務和事務傳播類型怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java spring嵌套事務和事務傳播類型怎么理解”吧!

  一個有事務的方法,去調用另一個有事務的方法,會怎么樣?

  一個沒有事務的方法,去調用一個有事務的方法,會怎么樣?

  多事務嵌套問題解答

  1、在同一個類中,一個無事務方法調用另一個有事務注解方法(比如@Async,@Transational)的方法,注解事務是不會生效的

  2、在同一個類中,一個有事務方法調用另一個有事務注解方法(比如@Async,@Transational)的方法,只有外層事務有效,被調的注解事務是不會生效的

  3、在不同類中,一個無事務方法調用另一個有事務注解方法(比如@Async,@Transational)的方法,有注解事務是生效的

  4、在不同類中,一個有事務方法調用另一個有事務注解方法(比如@Async,@Transational)的方法,兩個方法都有事務

  代碼示例:

  @Service

  public class PersonServiceImpl implements PersonService {

  @Autowired

  PersonDao personDao;

  @Override

  @Transactional

  public boolean addPerson(Person person) {

  boolean result = personDao.insertPerson(person)>0 ? true : false;

  return result;

  }

  @Override

  @Transactional

  public boolean updatePersonByPhoneNo(Person person) {

  boolean result = personDao.updatePersonByPhoneNo(person)>0 ? true : false;

  addPerson(person); //測試同一個類中@Transactional是否起作用

  return result;

  }

  }

  上述的情況,說白了,就是在一個Service內部,事務方法之間的嵌套調用,不管被調用普通方法和事務方法,都不會開啟新的事務!鄭州哪家人流醫院好 http://www.gz020zj.com/

  spring 在掃描bean的時候會掃描方法上是否包含@Transactional注解,如果包含,spring會為這個bean動態地生成一個類(即代理類,proxy),代理類是繼承原來那個bean的。此時,當這個有注解的方法被調用的時候,實際上是由代理類來調用的,代理類在調用之前就會啟動transaction。然而,如果這個有注解的方法是被同一個類中的其他方法調用的,那么該方法的調用并沒有通過代理類,而是直接通過原來的那個bean,所以就不會啟動transaction,我們看到的現象就是@Transactional注解無效。

  總結:spring采用動態代理機制來實現事務控制,動態代理最終都是要調用原始對象的,而原始對象在去調用方法時,是不會再觸發代理了!

  重點:自己也可以實現一個事務,原理就是AOP中的動態代理

  解決的嵌套事務方法就簡單了(兩種):

  把這兩個方法分開到不同的類中,把注解加到類名上面;

  Spring事務7種傳播屬性:

  REQUIRED(require)默認級別:不存在事務則創建一個事務

  REQUIRES_NEW(requires_new):新建一個自己的事務,不論當前是否存在事務,已存在的事務掛起

  NESTED(nested):存在事務則運行在嵌套事務中,不管是調用者還是被調用者不存在則創建一個事務

  SUPPORTS(supports):存在事務則加入,不存在也可以

  NOT_SUPPORT(not_support):以非事務方式運行,如果當前存在事務,則把當前事務掛起

  MANDATORY(mandatory):如果當前存在事務,則運行在當前事務中,如果當前無事務,則拋出異常,也即父級方法必須有事務

  NEVER(never):當前方法不能運行在事務中,存在事務則拋出異常

  代碼中實現:

  @Override

  @Transactional(propagation = Propagation.REQUIRED)

  public void addEmpByRequired(String name) {

  Employee employee = new Employee();

  employee.setDeptId(1);

  employee.setName(name);

  employee.setAddress("邯鄲");

  employeeMapper.insertSelective(employee);

  departmentService.addDept("jishubu");

  int i = 1/0;

  }

到此,相信大家對“java spring嵌套事務和事務傳播類型怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西华县| 墨江| 内江市| 河源市| 闽侯县| 兴化市| 晋城| 普兰县| 平湖市| 师宗县| 义乌市| 香港| 达拉特旗| 云林县| 元阳县| 吉安县| 个旧市| 双桥区| 广元市| 浦县| 重庆市| 孝义市| 吴桥县| 南京市| 浑源县| 台南县| 扶绥县| 青冈县| 库伦旗| 丹棱县| 昆山市| 宣威市| 宁海县| 陇西县| 萝北县| 萨嘎县| 太仆寺旗| 新蔡县| 潼关县| 松桃| 桦川县|