Spring管理事务
PlatformTransactionManager 帮助我们管理仁义平台的事务。
Hibernate HinernateTransactionManager
事务:(4大特征)
1.一致性
2.原子性
3.持久性
4. 隔离性
事务安全:
事务线程安全:脏读 、不可重复读、 幻读、读为提交
隔离级别: 1 2 4 (读已提交) 8
所有事务的操作有三步:
开启事务
提交事务
回滚事务
spring管理事务利用的是spring aop思维,将事务的操作织入到目标对象中。
Spring 管理事务的属性:
隔离级别 是否只读 事务的传播行为(7钟)
Spring 管理事务的三种方式:
(1)代码式
1).配置事务管理对象
2).配置事务管理的模块
3).在service中注入模块对象,然后调用execute方法
package cn.hd.spring_transaction.impl;
import cn.hd.spring_transaction.UserDao;
import cn.hd.spring_transaction.UserService;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallbackWithoutResult;
import org.springframework.transaction.support.TransactionTemplate;
import javax.annotation.Resource;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Resource(name = "transactionTemplate")
private TransactionTemplate tt;
public void setTt(TransactionTemplate tt) {
this.tt = tt;
}
@Override
public void transform(Integer form, Integer to, Integer money) {
/*TransactionCallbackWithoutResult()没有任何返回值的回调函数*/
tt.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
userDao.increase(to,money);
int i = 1/0;
userDao.decrease(form,money);
}
});
}
}
2.xml配置
1).有一个事务管理对象
<bean name="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2)。配置事务的通知
标签名tx:advice id 给当前的事务起个标号
Transact ....配置刚刚的事务管理对象
配置参数 :methor name 可以式具体某个方法(方法名)比较麻烦,可以通过通配符的
方式去配置
add*delete*update*get persist*remove*modify*find*
要求你的service命名必须规范。
isolation:隔离级别使用默认即可
propagation:事务传播行为required
read-only:是否只读如果查找true 否则为false
<!--配置事务通知-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--事务的属性-->
<tx:attributes>
<!--给那个方法添加事务;隔离:默认(级别4);传播行为:如果事物存在运行,不存在新建;是否只读-->
<tx:method name="transform" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
<tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
<tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="modify*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
<tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
3.将通知织入到目标对象
<!--将通知织入到目标对象-->
<aop:config>
<!--切点-->
<aop:pointcut id="txPc" expression="execution(* cn.hd.spring_transaction..impl.*ServiceImpl.*(..))"></aop:pointcut>
<!--切面-->
<aop:advisor advice-ref="myAdvice" pointcut-ref="txPc"></aop:advisor>
</aop:config>
配置切面不再使用aop:aspect,而是aop:advisor
3.注解配置
1.开启注释模式
<!--开启注解模式-->
<tx:annotation-driven></tx:annotation-driven>
2.在你想设置的事务的地方
@Transactional(isolation = Isolation.DEFAULT,propagation =
Propagation.REQUIRED,readOnly = false)
可以有两个位置
1)类上面,该类中所有方法都会使用以上的参数事务
2)方法名上面,该方法使用参数中的事务
如果两个都设置以方法名上面的事务为准