Spring資料庫事務管理
阿新 • • 發佈:2018-12-11
一.配置事務管理器
1.1.xml事務名稱空間
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
1.2.資料庫連線池
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="driverClassName" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> <!--初始化連線大小 --> <property name="initialSize" value="${initialSize}"/> <!--連線池最大數量--> <property name="maxActive" value="${maxActive}"/> <!--連線池最大空閒 --> <property name="maxIdle" value="${maxIdle}"/> <!--連線池最小空閒 --> <property name="minIdle" value="${minIdle}"/> <!--獲取連線最大等待時間 --> <property name="maxWait" value="${maxWait}"/> </bean>
1.3.配置資料來源事務管理器
DataSourceTransactionManager定義資料庫管理器,這樣Spring就知道你將資料庫事務委託給事務管理器transactionManager了
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
二.宣告事務,2種方法
2.1(一).XML配置
與事務屬性關聯的方法名。萬用字元(*)可以用來指定一批關聯到相同的事務屬性的方法
<!-- 配置事務通知屬性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- 定義事務傳播屬性 --> <tx:attributes> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="select*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="get*" propagation="REQUIRED" read-only="true" /> <tx:method name="*" propagation="REQUIRED" read-only="true" /> </tx:attributes> </tx:advice> <!-- 配置事務切面 --> <aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.hly.ssm.service.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation" /> </aop:config>
tx:method:
propagation:
1.REQURED:如果有事務在執行,當前的方法就在這個事務內執行,否則就啟動一個新的事務,並在自己的內部執行、
2.REQURES_NEW:當前的方法必須啟動新事物,並在他自己的事務內部執行,如果有事務在執行,應該將它掛起
3.SUPPORTS:如果有事務在執行,當前的方法就在這個事務內執行,否則它可以不執行在事務中
4.NOT_SUPPORTE:當前的方法不應該執行在事務中,如果有執行的事務,應將它掛起
5.MANDATORY:當前的方法必須執行在事務內部,如果沒有正在執行的事務,就丟擲異常
6.NEVER:當前的方法不應該執行在事務中,如果有執行的事務,就丟擲異常
7.NESTED:如果有事務執行,當前的方法就應該在這個事務的巢狀事務內部執行,否則就啟動一個新的事務,並將他在自己的的事務內執行
readOnly:該屬性表示指定的事務為只讀,表示這個事務只讀資料但是不更新資料,這樣可以幫助資料庫引擎優化事務。若一個方法只讀取資料,建議設定只讀屬性。將所有的以find,select,query,get開頭的查詢方法都設定為了只讀,這將大大提高查詢效率。
2.1(二).註解事務
使用註解定義事務
<tx:annotation-driven transaction-manager="transactionManager"/>
例:
@Service
public class UserServiceImpl implements UserService {
@Autowired
UserDao userDao;
@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED)
public User selectUserById(String userId) {
return userDao.selectUserById(userId);
}
@Override
public int insertUser(User user) {
return userDao.insertUser(user);
}
}
2.2測試
@Test
public void testSelectTransation(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("/spring/applicationContext.xml");
UserService userService = ctx.getBean(UserService.class);
User user = userService.selectUserById("001");
System.out.println(user.toString());
}