2010-10-28 33 views
2

使用@Transactional在一個方法之間有什麼區別,而不是使用它?Spring + hibernate和@Transactionl註解,它是如何工作的?

我寫了一些簡單的測試,但似乎沒有什麼區別。

我想學習如何使用spring和annotation來管理事務。

謝謝大家。

+4

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-decl-explained – 2010-10-28 19:43:23

回答

1

如果將@Transactional放在方法上,那麼每個訪問數據庫的方法調用(也包括其他@Transactional方法中的每個方法調用 - 取決於您如何設置)都只使用一個數據庫連接。這意味着,您可以回滾事務內發生的所有更新/插入。如果其中一個更新/插入引發異常,則可以回滾在該異常之前發生的事務內的所有更新/插入 - >數據完整性

簡而言之,如果您有一個@Transactional方法,例如使用spring JdbcTemplate做一些插入或更新(無論多少次),它們將是事務性的,就某些異常是否被拋出而言,應用回滾 - 您必須閱讀有關詳細信息的文檔。

如果您在多於一個方法上使用@Transactional(propagation = Propagation.REQUIRED),那麼如果調用這些方法,則使用這些方法的所有數據庫插入/更新都將成爲一個大事務的一部分。

重要提示:正如我在評論中提到的那樣,您不得在聲明它們的同一類中調用這些方法。原因是,它全部基於AOP代理調用,只有在實例化DAO對象並在對象上調用@Transactional方法時纔會發生這種情況。否則它將無法正常工作,而且你也許不知道爲什麼。

+0

我可以認爲@Transactional像一個session.beginTransaction () - > myTransactionalMtehod() - > transaction.commit()?如果我調用兩個使用@transactional的連續方法,事務是否開始提交? – blow 2010-10-28 20:03:25

+0

你可以這樣想,但採用分散的方式。如果您選擇「PROPAGATION_REQUIRED」選項,則所有@Transactional方法都是一個大事務的一部分...然後事務可能會覆蓋來自各個地方的持久性方法。這是一個AOP,在持久化方法執行數據庫請求之前,它提供了共享數據庫連接,以便作爲事務一部分的所有方法向同一對象請求數據庫,然後可以提交/回滾。知道必須從不同的類/對象調用@Transactional方法是很重要的。 – lisak 2010-10-28 20:23:02

+0

這是一個AOP代理,因此您不能從同一個對象調用@Transactional方法,調用將不會被代理,並且不會有任何事務...只是實例化DAO對象,使用@Transactional方法,在其他地方,並調用它的方法... – lisak 2010-10-28 20:26:26