事务管理基本概念【了解】

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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值