Spring中的@Transactional的工作原理

1、原理

事務的概念想必大傢都很清楚,其ACID特性在開發過程中占有重要的地位。同時在並發過程中會出現一些一致性問題,為瞭解決一致性問題,也出現瞭四種隔離級別,這裡就不再詳述瞭,感興趣的可以去查一下。下面我們討論一下Spring中的事務。

Spring中的事務有兩種:

  • 編程式事務
  • 聲明式事務

通常情況下我們使用聲明式事務,它是基於SpringAOP實現的。基於AOP實現的事務極大得幫助瞭我們的開發效率,其本質是對方法進行前後攔截,在目標方法前加入一個事務,在目標完成後再加入一個事務進行提交或者回滾,這種方式下我們並不需要在目標方法中的代碼中摻雜事務管理代碼,輕松進行事務管理。

而編程式事務就需要我們修改代碼來進行事務管理。這種方法看似很麻煩,但是它的存在自有它的道理,上面我們講到的聲明式事務控制,其控制的細粒度隻能作用到方法上,無法在代碼塊中實現聲明式事務控制。我們都知道,一旦加上事務,程序的運行效率就會降低,所以編程式事務也有它的用武之地。

但是我們的廣大勞動人民也是智慧的。直接將需要事務的代碼塊獨立成方法,這樣仍然可以使用聲明式事務。當然在開發中具體情況要具體分析瞭。

2、用法

事務的傳播行為: 

 事務的隔離級別

@Transactional屬性

 示例代碼:

@Service
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleDao roleDao;

    @Transactional(propagation = Propagation.SUPPORTS,readOnly = true)
    @Override
    public List<Role> findAllRoles() {
        return roleDao.selectAllRoles();
    }
}

3、拓展

1、為什麼聲明式事務隻能應用於方法上?

  • 因為聲明式事務是基於AOP實現的,AOP是基於動態代理實現的。
  • 動態代理隻會捕捉來自外部的方法調用,
  • 意思就是類內部的方法調用類內部的另外方法,並不會發生事務行為。

到此這篇關於Spring中的@Transactional的工作原理的文章就介紹到這瞭,更多相關Spring @Transactional 內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: