事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。在 TransactionDefinition 中以 int 的值来表示超时时间,默认值是-1,其单位是秒
2.5回滚规则回滚规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚
3.TransactionStatus事务状态org.springframework.transaction.TransactionStatus接口用来记录事务的状态,该接口定义了一组方法,用来获取或判断事务的相应状态信息
TransactionStatus接口源码:
Spring 事务管理有两种方式:编程式事务管理、声明式事务管理
编程式事务管理通过TransactionTemplate手动管理事务,在实际应用中很少使用,我们来重点学习声明式事务管理
声明式事务管理有三种实现方式:基于TransactionProxyFactoryBean的方式、基于AspectJ的XML方式、基于注解的方式
我们以用户转账为例来学习这三种不同的实现方式,首先来搭建转账环境
1.建表,初始化数据库
数据库原始数据:
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的方式