PlatformTransactionManager 幫助我們管理任意平臺的事務。
Jdbc DataSourceTransactionManager
Hibernate HibernateTransactionManager
…… ……TransactionManager
事務:(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(TransactionTemplatett) {
this.tt = tt;
}
@Override
public void transform(Integer form,Integer to, Integer money) {
/*TransactionCallbackWithoutResult()沒有任何返回值的回調函數*/
tt.execute(newTransactionCallbackWithoutResult() {
@Override
protected voiddoInTransactionWithoutResult(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">
<propertyname="dataSource" ref="dataSource"></property>
</bean>
2、配置事務的通知
標籤名 tx:advice id給當前的事務起個標記
Transact….. 配置剛剛的事務管理對象
配置參數:method name 可以是具體某個方法(方法名) 比較麻煩,可以使用通配符的方式去配置
add* delete* update* get* persist* remove* modify* find*
要求:你的service的命名必須規範。
isolation:隔離級別使用默認即可(4)default
propagation: 事務傳播行爲 required
read-only:是否只讀 如果查找 true 否則爲false
<!--配置事務通知-->
<tx:advice id="myAdvice" transaction-manager="transactionManager">
<!--事務的屬性-->
<tx:attributes>
<!--給那個方法添加事務;隔離:默認(級別4);傳播行爲:如果事物存在運行,不存在新建;是否只讀-->
<tx:methodname="transform" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:method name="get*"isolation="DEFAULT" propagation="REQUIRED"read-only="true"/>
<tx:methodname="add*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="update*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="delete*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="find*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
<tx:methodname="persist*" isolation="DEFAULT" propagation="REQUIRED"read-only="false"/>
<tx:methodname="modify*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
<tx:methodname="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:advisoradvice-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、方法名上面,該方法使用參數中的事務
如果兩個都設置以方法名上面的事務爲準。