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>