配置事务管理器,配置业务层的代理
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
测试的时候注入的是代理后的对象,就可以对方法进行事务管理了
编程式事务的实现代码
在service层注入dao层,1、含有dao层的成员变量,以及set方法;2、在配置文件中注入
public class MyAccountServiceImpl implements AccountService {
/**
* 注入转账的dao
*/
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
<!--配置业务层的类-->
<bean id="service" class="com.ytcool.service.MyAccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
事务的隔离级别就是来解决并发安全问题的:SERIALIZABLE最安全,因为它的锁的粒度最大,直接会锁表。也导致了它执行起来效率最低
spring默认采用的DEFAULT隔离级别,也就是采用数据库默认的隔离级别,
Mysql默认采用REPEATABLE_READ.ORACLE默认采用READ_COMMITTED隔离级别
org.springframework.transaction.TransactionDefinition 事务定义,包含事务的隔离级别、传播行为。
事务的四大特性:原子性、一致性(执行事务前后的数据完整性保持一致)、隔离性、持久性;
如果不考虑隔离性,会引发安全问题如下:脏读、不可重复读、幻读(虚读)
脏读:一个事务读取到另一个事务改写了但没有提交的数据;
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同(读取到另一个事务提交的数据)
幻读(虚读)读取到另一个事务插入的一些记录
org.springframework.transaction.PlatformTransactionManager 平台事务管理器,
org.springframework.transaction.PlatformTransactionManager#getTransaction
org.springframework.transaction.PlatformTransactionManager#commit
org.springframework.transaction.PlatformTransactionManager#rollback
org.springframework.transaction.TransactionDefinition
org.springframework.transaction.TransactionStatus
1
1
xml
transactionproxyfactorybean
配置
2
编程式事务控制
spring
spring transaction interface
1
事务传播
事务传播行为
Paltform TransactionManager
事务管理
事务
事务管理
传播行为作用:处理方法间互相调用时的业务处理。
7种业务传播行为:3种一个业务统一处理;3种不在一个业务处理;一种嵌套业务
spring-事务管理-接口
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
<tx:annotation-driven> 默认值
首先,<tx:annotation-driven/> 会有一个属性来指定使用哪个事务管理器,如:<tx:annotation-driven transaction-manager="transactionManager" />
@Transaction
开启注解事务后,@Transaction就会生效