Spring事务管理器
1、创建实体和接口
public class Bank { private Integer id; private String name; private String manay; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getManay() { return manay; } public void setManay(String manay) { this.manay = manay; } }
2、接口中新建方法
public interface IBankDao { //转出 public int RolloutMoney(String card_code,double money); //转入 public int RollinMoney(String card_code,double money); }
3、IBankDaoImpl类
@Repository public class IBankDaoImpl implements IBankDao { //植入JDBC模板 @Resource private JdbcTemplate jdbcTemplate; @Override public int RolloutMoney(String card_code, double money) { int outconut = jdbcTemplate.update("update bank set card_balance=card_balance-? where card_code=?",money,card_code); return outconut; } @Override public int RollinMoney(String card_code, double money) { int incount = jdbcTemplate.update("update bank set card_balance=card_balance+? where card_code=?",money,card_code); return incount; } }
4、IBankService类
public interface IBankService { //转账的方法 public int transfer(String out_card_code,String in_card_code,double money) throws Exception; }
5、IBankServiceImpl类
@Service("iBankService") public class IBankServiceImpl implements IBankService { //植入Dao层对象 @Resource private IBankDao iBankDao; @Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED) @Override public int transfer(String out_card_code, String in_card_code, double money) throws Exception { //转出 int out = iBankDao.RolloutMoney(out_card_code,money); //模拟异常 //Spring事务管理会不会对所有异常都会回滚,只能对运行时异常eollback if (true){ throw new RuntimeException("=============异常============="); } //转入 int in=iBankDao.RollinMoney(in_card_code,money); return out+in; } }
6、applicationContext.xml
<!--加载配置文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!--Datasource供模板调用 DriverManagerDataSource:spring提供管理数据源的 c3p0数据源 dbcp数据源--> <bean id="dataSourse" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <!--扫描注解:包扫描器--> <context:component-scan base-package="com.Spring"/> <!--植入JdbcTemplate--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSourse"/> </bean> <!--事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--管理数据源--> <property name="dataSource" ref="dataSourse"/> </bean> <!--AOP事务--> <tx:advice id="transactionAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="trans*" isolation="READ_COMMITTED" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="pointCut" expression="execution(* *..service.impl.*.*(..))"/> <aop:advisor advice-ref="transactionAdvice" pointcut-ref="pointCut"/> </aop:config> <!--Spring支持注解式事务配置--> <tx:annotation-driven/> <!--事务代理工厂Bean--> <bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <!-- 事务管理器--> <property name="transactionManager" ref="transactionManager"></property> <!--目标对象--> <property name="target" ref="iBankService"></property> <!--设置方法--> <property name="transactionAttributes"> <props> <!--方法对应的隔离级别和传播行为--> <prop key="transfer">PROPAGATION_REQUIRED,ISOLATION_DEFAULT</prop> </props> </property> </bean>
7、TransferTest类
public class TransferTest { public static void main(String[] args) { ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); IBankService iBankService = (IBankService)ctx.getBean("transactionProxy"); try { iBankService.transfer("45354754","63285978",100); }catch (Exception e){ e.printStackTrace(); } System.out.println("转账成功"); } }