1. 程式人生 > >事務管理基本概念【瞭解】

事務管理基本概念【瞭解】

1.事務管理相關介面PlatformTransactionManager

DataSourceTransactionManager

使用Spring JDBC或iBatis 進行持久化資料時使用

HibernateTransactionManager

使用Hibernate3.0版本進行持久化資料時使用

獲取事務狀態資訊

TransactionStatus getTransaction(TransactionDefinition definition)

提交事務

void commit(TransactionStatus status)

回滾事務

void rollback(TransactionStatus status)

2.TransactionDefinition

獲取事務名稱

String getName()

獲取事務隔離級

int getIsolationLevel()

獲取事務傳播行為

int getPropagationBehavior()

獲取事務超時時間

int getTimeout()

獲取事務是否只讀

boolean isReadOnly()

3.TransactionStatus

重新整理事務

void flush()

獲取是否存在儲存點

boolean hasSavepoint()

獲取事務是否完成

boolean isCompleted()

獲取事務是否為新的事務

boolean isNewTransaction()

獲取事務是否回滾

boolean isRollbackOnly()

設定事務回滾

void setRollbackOnly()

4.事務隔離級反映事務提交併發訪問時的處理態度

ISOLATION_DEFAULT 預設級別,歸屬下列某一種

ISOLATION_READ_UNCOMMITTED 可以讀取未提交資料

ISOLATION_READ_COMMITTED 只能讀取已提交資料,解決髒讀問題(Oracle預設級別) ISOLATION_REPEATABLE_READ

是否讀取其他事務提交修改後的資料,解決不可重複讀問題(MySQL預設級別) ISOLATION_SERIALIZABLE

是否讀取其他事務提交新增後的資料,解決幻影讀問題

程式設計式事務【瞭解】【難點】

1.案例環境:銀行轉賬業務A賬戶到B賬戶操作

表結構

CREATE TABLE `tbl_account` (

`uuid` bigint(10) NOT NULL,

`name` varchar(30) NOT NULL,

`money` double(10,2) NOT NULL,

PRIMARY KEY (`uuid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `tbl_account` VALUES ('1', 'tom', '1000.00');

INSERT INTO `tbl_account` VALUES ('2', 'jerry', '1000.00');

資料層製作介面與實現類

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{

public void inMoney(String in, Double money) {

String sql = "update tbl_account set money = money + ? where name = ?"; this.getJdbcTemplate().update(sql,money,in);

}

public void outMoney(String out, Double money) {

String sql = "update tbl_account set money = money - ? where name = ?"; this.getJdbcTemplate().update(sql,money,out);

}

}

業務層製作介面與實現類

public class AccountServiceImpl implements AccountService {

private AccountDao accountDao;

public void setAccountDao(AccountDao accountDao) {

this.accountDao = accountDao;

}

public void transfer(String out, String in, Double money) {

//一個人減錢

accountDao.outMoney(out, money);

//一個人加錢

accountDao.inMoney(in, money);

}

}

配置對應的Bean

<!-- Service -->

<bean id="accountService" class="cn.itast.tx.account.AccountServiceImpl">

<property name="accountDao" ref="accountDao"/>

</bean>

<!-- DAO -->

<bean id="accountDao" class="cn.itast.tx.account.AccountDaoImpl">

<property name="dataSource" ref="dataSource"/>

</bean>

<!-- DataSource --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/springdb"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> 2. TransactionTemplate TransactionTemplate事務模板物件,用於完成事務操作,使用execute方法完成 業務層通過TransactionTemplate物件完成將多個操作製作成同一事務 private TransactionTemplate transactionTemplate; public void setTransactionTemplate(TransactionTemplate transactionTemplate) { this.transactionTemplate = transactionTemplate; } public void transfer(final String out,final String in,final Double money) { TransactionCallback tc = new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus arg0) { //在當前方法中執行的所有操作處於同一個事務 accountDao.outMoney(out, money); accountDao.inMoney(in, money); } }; //事務管理操作 transactionTemplate.execute(tc); }

3.業務層Bean注入事務管理模板

<bean id="accountService" class="cn.itast.tx.account.AccountServiceImpl">

<property name="accountDao" ref="accountDao"/>

<property name="transactionTemplate" ref="transactionTemplate"/>

</bean>

4.宣告一個事務管理模板Bean,該Bean依賴與事務管理器物件

<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate"> <property name="transactionManager" ref="transactionManager"/>

</bean>

5.宣告一個事務管理器的Bean,該Bean依賴與DataSource執行,該DataSource必須與資料層操作注入的DataSource相同

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"/>

</bean>