1. 程式人生 > >service層@Transactional事務控制使用以及注意

service層@Transactional事務控制使用以及注意

@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條寫的注意區分: