1. Spring 事务的三大组件
Spring 事务管理高层抽象主要包括3个接口
PlatformTransactionManager : 事务管理器
TransactionDefinition : 事务定义信息(隔离,传播,超时,只读)
TransactionStatus :事务具体运行状态
在事务定义信息中 有四种定义了
事务的是否只读 : 当前要执行的代码是否应用到事务,如果事务是只读的话不会用到事务的只读控制 ( readonly )
事务的隔离级别 : 四种隔离级别
事物的传播行为 : 事物的嵌套问题
事务的超时时间 : 默认为-1 永不超时
2. Spring 事务管理
Spring 支持两种方式事务管理
编程式的事务管理
使用XML配置声明式事务
2.1 编程式:
配置我们的工厂bean2.xml
<context:component-scan base-package="trans"></context:component-scan>
<!--扫描外部的配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!--数据库连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置jdbctemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务模板-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean>
配置jdbctemplate 中的 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/···
jdbc.username=···
jdbc.password=···
创建一个Dao
@Repository
public class AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;
//进账
public void intMoney(String account,int money){
jdbcTemplate.update("update account set money=money+? where name=?",money,account);
}
//出账
public void outMoney(String account,int money){
jdbcTemplate.update("update account set money=money-? where name=?",money,account);
}
创建一个Service
@Service
public class AccountService {
@Autowired
private AccountDao accountDao;
@Autowired
private TransactionTemplate transactionTemplate;
public void transfer(){
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
accountDao.intMoney("aaa",100);
//有异常 不会进行转账
int i=1/0;
accountDao.outMoney(