更新時間:2023-03-09 來源:黑馬程序員 瀏覽量:
定義了事務(wù)的管理行為,例如事務(wù)的開始、提交、回滾等。
定義了事務(wù)的隔離級別、超時時間、是否只讀等屬性。
表示事務(wù)的狀態(tài),例如事務(wù)是否已經(jīng)開始、是否已經(jīng)提交、是否已經(jīng)回滾等。
以下是一個簡單的示例代碼,演示如何使用這三個核心接口來進行事務(wù)管理:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; public class MyService { @Autowired private JdbcTemplate jdbcTemplate; @Autowired private PlatformTransactionManager transactionManager; public void myTransactionalMethod() { // 定義事務(wù)屬性 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); def.setTimeout(30); def.setReadOnly(false); // 開始事務(wù) TransactionStatus status = transactionManager.getTransaction(def); try { // 在事務(wù)中執(zhí)行數(shù)據(jù)庫操作 jdbcTemplate.update("INSERT INTO my_table (name, age) VALUES (?, ?)", "Alice", 25); // 提交事務(wù) transactionManager.commit(status); } catch (Exception ex) { // 回滾事務(wù) transactionManager.rollback(status); } } }
在這個示例代碼中,我們使用了DefaultTransactionDefinition來定義了事務(wù)的屬性,然后使用 PlatformTransactionManager來開啟、提交、回滾事務(wù),并使用JdbcTemplate來執(zhí)行數(shù)據(jù)庫操作。
接下來,我們來對以上的示例代碼進行進一步的解釋:
1.@Autowired 注解用于自動注入JdbcTemplate和PlatformTransactionManager對象,這些對象需要在 Spring 的配置文件中進行配置。
2.我們使用 DefaultTransactionDefinition 來定義事務(wù)的屬性。在這個示例代碼中,我們將隔離級別設(shè)置為 ISOLATION_READ_COMMITTED,表示讀已提交的數(shù)據(jù),將傳播行為設(shè)置為 PROPAGATION_REQUIRED,表示如果當(dāng)前已經(jīng)存在事務(wù),則加入該事務(wù)中,否則創(chuàng)建一個新的事務(wù)。我們還將事務(wù)超時時間設(shè)置為 30 秒,并將只讀屬性設(shè)置為 false。
3.我們通過調(diào)用transactionManager.getTransaction(def) 方法來開啟事務(wù),并將返回的TransactionStatus 對象保存在status變量中。如果事務(wù)開啟成功,則status對象的isCompleted()方法返回false。
4.在事務(wù)中,我們使用JdbcTemplate來執(zhí)行數(shù)據(jù)庫操作。在這個示例代碼中,我們向一個名為 my_table的表中插入一條數(shù)據(jù)。
5.如果在事務(wù)中發(fā)生異常,我們將通過調(diào)用transactionManager.rollback(status)方法來回滾事務(wù)。如果事務(wù)已經(jīng)提交,則該方法將不起作用。
6.如果在事務(wù)中沒有發(fā)生異常,我們將通過調(diào)用transactionManager.commit(status)方法來提交事務(wù)。
通過使用Spring的事務(wù)管理接口,我們可以很方便地管理事務(wù),從而保證數(shù)據(jù)的一致性和完整性。