Spring
事务的属性
1 定义事务的隔离级别
isolation=默认值 (随着数据库的隔离级别而变化)
2 定义事务的超时时间
timout=-1 (什么时候执行完毕什么时候结束)
3 定义事务是否只读行为
增删改语句 readonly=false 开事务(默认)
查询语句: readonly=true 关闭事务 提高查询效率
4 定义事务的传播行为
propagation=REQUIRED
propagation=SUPPORTS
隔离级别分类:
- read_uncommited:(读未提交)会出现脏读
- read_committed:(读已提交)可以解决脏读,会出现不可重复读
- repeatable_read:(可重复读)可以解决不可重复读 【mysql默认】
- serializable:(串行化)可以解决一切
propagation:多方法嵌套时,被调用方法对事务的支持情况
- REQUIRED(保证必须有事务)
被调用者会看调用者是否有事务,如果有事务直接加入,如果没事务,创建一个事务
保证多个方法在一个事务中- SUPPORTS(可有可无事务)
被调用者会看调用者是否有事务,如果有事务直接加入,如果没事务,就使用非事务一起执行
声明式事务使用
1.application.xml开启对注解事物的支持
<!--对事务注解的支持-->
<tx:annotation-driven></tx:annotation-driven>
2.将事务管理器交给Spring容器管理
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
3.在需要事务的类或者方法上用@Transactional注解配置事务
/**
* 配置事务
* @Transactional
* 配置到类上 :表明此类中的所有方法都具有此事务
* 配置到方法上 :表明此方法具有此事务
* * 就近原则(方法上的配置会覆盖类上的配置)
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional(isolation = Isolation.DEFAULT,timeout =-1,readOnly = false,propagation = Propagation.REQUIRED)
public void tranFer() {
accountDao.toMoney();
int i=1/0;
accountDao.inMoney();
}
}