Spring 事务管理详解 (2)

事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。在 TransactionDefinition 中以 int 的值来表示超时时间,默认值是-1,其单位是秒

2.5回滚规则

回滚规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚

3.TransactionStatus事务状态

org.springframework.transaction.TransactionStatus接口用来记录事务的状态,该接口定义了一组方法,用来获取或判断事务的相应状态信息
TransactionStatus接口源码:

public interface TransactionStatus extends SavepointManager, Flushable { boolean isNewTransaction();// 是否是新的事物 boolean hasSavepoint();// 是否有恢复点 void setRollbackOnly();// 设置为只回滚 boolean isRollbackOnly();// 是否为只回滚 void flush();// 刷新 boolean isCompleted();// 是否已完成 } Spring 事务管理实现方式

Spring 事务管理有两种方式:编程式事务管理声明式事务管理
编程式事务管理通过TransactionTemplate手动管理事务,在实际应用中很少使用,我们来重点学习声明式事务管理
声明式事务管理有三种实现方式:基于TransactionProxyFactoryBean的方式基于AspectJ的XML方式基于注解的方式
我们以用户转账为例来学习这三种不同的实现方式,首先来搭建转账环境
1.建表,初始化数据库

create table account ( id bigint auto_increment primary key, name varchar(32) not null, money bigint not null, constraint account_name_uindex unique (name) ); insert into account (name, money) values(\'Bill\', 2000),(\'Jack\', 2000);

数据库原始数据:

数据库.JPG

2.创建DAO实现类

public class TransferDaoImpl extends JdbcDaoSupport implements TransferDao { /** * @param name 账户名称 * @param amount 支出金额 */ @Override public void payMoney(String name, Long amount) { String sql = "update account set money=money-? where name=?"; this.getJdbcTemplate().update(sql, amount, name); } /** * @param name 账户名称 * @param amount 收入金额 */ @Override public void collectMoney(String name, Long amount) { String sql = "update account set money=money+? where name=?"; this.getJdbcTemplate().update(sql, amount, name); } }

3.创建Service实现类(事务管理类)

public class TransferServiceImpl implements TransferService { private TransferDao transferDao; public void setTransferDao(TransferDao transferDao) { this.transferDao = transferDao; } /** * @param source 支出方账户名称 * @param name 收入方账户名称 * @param amount 转账金额 */ @Override public void transferMoney(String source, String destination, Long amount) { transferDao.payMoney(source, amount); int i = 100/0;//此处用于测试抛异常时是否会回滚 transferDao.collectMoney(destination, amount); } }

4.创建Spring核心配置文件

<!-- 读取db.properties配置信息 --> <context:property-placeholder location="db.properties"></context:property-placeholder> <!-- 配置c3p0数据源 --> <bean> <property value="${db.driverClass}" /> <property value="${db.url}" /> <property value="${db.username}" /> <property value="${db.password}" /> </bean> <bean> <property ref="dataSource" /> </bean> <bean> <property ref="transferDao" /> </bean> 基于TransactionProxyFactoryBean的方式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgyxgx.html