service層@Transactional事務控制使用以及注意
阿新 • • 發佈:2019-01-09
@Service @Transactional public class CeshiService { @Autowired LoginFeignClient loginFeignClient; @Transactional(rollbackFor = Exception.class) public void test(){ User user=null; //try { log.info("ceshi transactional is 1"); user=loginFeignClient.test1().getData(); throw new RuntimeException(); //log.info("ceshi transactional is 2"); // loginFeignClient.test(); // }catch (Exception e){ // throw new Exception(e.getLocalizedMessage()); // } } }
上述就是一個事務的service,當獲取到throw的exception時執行rollback;
1.service中是通過feign呼叫遠端服務時,上述寫法是無法回滾的,只有repository在原生代碼處理才可以,因為db提供了回滾處理。
2.如果是feign遠端呼叫,又想使用事務,則需要進行逆服務處理,需要獲取異常時,手動呼叫逆服務處理
3.非事務宣告方法呼叫事務宣告方法,則事務失效。使用了@Transactional的方法,對同一個類裡面的方法呼叫, @Transactional無效。比如有一個類Test,它的一個方法A,A再呼叫Test本類的方法B(不管B是否public還是private),但A沒有宣告註解事務,而B有。則外部呼叫A之後,B的事務是不會起作用的。(經常在這裡出錯)
4.一個service中宣告事務方法,呼叫了另外一個service中的宣告事務方法,則被呼叫的方法事務也還起作用,事務不太建議放到2個見service中。下面的例子,下面的事務是起作用的,跟上面第3條寫的注意區分: