1.基于注解的事务控制

自定义的bean可以用注解,非自定义的就在配置中就可以了

事务控制解析:

(1)使用@Transactional在需要进行事务控制的类或是方法上修饰,注解可用的属性同xml配置方式,例如:隔离级别,传播行为等

(2)注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置

Spring基于注解的事务控制_spring

(3)使用在方法上,不同的方法可以采用不同的事务参数配置

Spring基于注解的事务控制_spring_02

 (4)xml配置文件中要开启事务的注解驱动<tx:annotation-driven/>

Spring基于注解的事务控制_xml_03

 案例:同基于xml方式事务控制的案例

下面是修改的部分

AccountDaoImpl.java



package com.company.dao.impl;

import com.company.dao.AccountDao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
@Autowired
private JdbcTemplate jdbcTemplate;

public void out(String outMan, double money) {
jdbcTemplate.update("update account set money=money-? where name=? ", money, outMan);
}

public void in(String inMan, double money) {
jdbcTemplate.update("update account set money=money+? where name=?",money, inMan);
}
}


  AccountServiceImpl.java



package com.company.service.impl;

import com.company.dao.AccountDao;
import com.company.service.AccountService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan, money);
accountDao.in(inMan, money);
}
}


  applicationContext.xml



<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">

<!--组件扫描-->
<context:component-scan base-package="com.company"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>

<!--配置平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>

</beans>


2.总结

(1)平台事务管理配置(xml方式)

(2)事务通知的配置(@Transactional注解配置)

(3)事务注解驱动的配置<tx:annotation-driven/>