spring of transaction management (papers and notes for configuration mode, transfer environment to build)

spring of transaction management (transfer environment to build)

 

 Spring's transaction management
   concept Affairs
      1 What is a transaction


      2 transactional characteristics
      
      3 isolation without considering the issue a read

      4 reads solve the problem

         (1) Set the isolation level


 Spring transaction management api Introduction
    1 spring Transaction Management are two ways
      the first programmatic transaction management (without)
      the second declarative transaction management
      (1) xml configuration file based
      (2) based on annotation mode

     2 Spring transaction management api introduction

     


      (1) spring for different layers dao framework provides an interface different implementation class.



      (2) first configure the transaction manager
          


to build a transfer environment
    1 to create database tables, add data
   


     2 created dao class service and complete the injection relationship


        (1) service also known as business logic layer


        (2) dao layer, simple operation of the database layer, the service without adding dao layer.
        (3) requirements: 100 to transfer Wang pony


        小王少100   
        小马多100
      3 产生问题
         (1)如果小王少了100以后,出现异常,小马不会多100,钱丢失。
      4 解决
         (1)添加事
务解决,出现异常回滚操作。

 

 

 声明式事务管理(xml)
     org.springframework.jdbc.datasource.DataSourceTransactionManager
       (1) 配置文件方式aop思想配置
          第一步  配置事务管理器
          


          第二步 配置事务增强


          第三步 配置切面


org.springframework.jdbc.datasource.DataSourceTransactionManager
完整spring配置文件 bean3.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:context="http://www.springframework.org/schema/context"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
       	http://www.springframework.org/schema/tx/spring-tx.xsd
       	http://www.springframework.org/schema/aop 
       	http://www.springframework.org/schema/aop/spring-aop.xsd">

	<!-- 开启c3p0连接池操作 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	    <!-- 注入属性值 -->
	    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	    <property name="jdbcUrl" value="jdbc:mysql:///news"></property>
	    <property name="user" value="root"></property>
	    <property name="password" value="root"></property>
	</bean>
	<!-- 第一步配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	   <!-- 注入dataSource -->
	   <propery name="dataSource" ref="dataSource"></propery>
	</bean>
	 <!-- 第二步配置事务增强 -->
	 <tx:advice id="txadvice" transaction-manager="transactionManager">
	      <!-- 做事务操作 -->
	      <tx:attributes>
	      <!-- 设置进行事务操作的方法匹配规则 -->
	          <tx:method name="account*" propagation="REQUIRED"/>
	      </tx:attributes>
	 </tx:advice>
	<!-- 第三步配置切面 -->
	<aop:config>
	     <!-- 切入点 -->
	    <aop:pointcut expression="execution(*com.cn.service.*(..))" id="pointcut1"/>
	      <!-- 切面 -->
	      <aop:advisor advice-ref="txadvice" pointcut-ref="pointcut1"/>
	</aop:config>
	
	<!-- 创建service和dao对象, 在service注入dao对象 -->
    <bean  id="ordersService" class="com.cn.service.OrdersService">
       	<property name="orderDao" ref="orderDao"></property>
    </bean>
     <bean  id="orderDao" class="com.cn.dao.OrderDao">
           <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
    <bean  id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
           <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans>

代码实例

 

 

dao层OrderDao.java

package com.cn.dao;

import org.springframework.jdbc.core.JdbcTemplate;

public class OrderDao {
	//注入jdbcTemplate
	private JdbcTemplate  jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	/**
	 * 做对数据库操作的方法,不写业务操作
	 * 
	 */
	//少钱的方法
	public  void  lessMoney(){
		String sql=" update account set salary=salary-?  where username=?";
		jdbcTemplate.update(sql, 100, "小王");
	}
	
	//小马多钱的方法
	public void moreMoney(){
		String sql=" update account set salary=salary+?  where username=?";
		jdbcTemplate.update(sql, 100, "小马");
	}
}


Service层OrdersService.java

package com.cn.service;

import com.cn.dao.OrderDao;

public class OrdersService {
	private OrderDao  orderDao;
	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}
	//调用dao的方法
	//业务逻辑层,写转账业务
	public void accountMoney(){
		//小王少100
		orderDao.lessMoney();
		int  i=1/0;
		//小马多100
		orderDao.moreMoney();
	}
}
}

测试类TestService.java

package com.cn.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestService {
	@Test
	public void testDemo(){
		ApplicationContext context=
				new ClassPathXmlApplicationContext("bean3.xml");
		OrdersService  service=(OrdersService) context.getBean("ordersService");
		service.accountMoney();
	}
}


程序下载地址:http://pan.baidu.com/s/1i5utMlf

 

      声明式事务管理(注解)
        第一步  配置事务管理器


        第二步  配置事务注解


        第三步  在要使用事务的方法所在类上面添加注解

具体代码

bean3.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:context="http://www.springframework.org/schema/context"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx
       	http://www.springframework.org/schema/tx/spring-tx.xsd
       	http://www.springframework.org/schema/aop 
       	http://www.springframework.org/schema/aop/spring-aop.xsd">

	<!-- 开启c3p0连接池操作 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	    <!-- 注入属性值 -->
	    <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	    <property name="jdbcUrl" value="jdbc:mysql:///news"></property>
	    <property name="user" value="root"></property>
	    <property name="password" value="root"></property>
	</bean>
	<!-- 第一步配置事务管理器 -->
	<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	   <!-- 注入dataSource -->
	   <propery name="dataSource" ref="dataSource"></propery>
	</bean>
	<!-- 第二步开启事务注解 -->
	<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
			
	<!-- 创建service和dao对象, 在service注入dao对象 -->
    <bean  id="ordersService" class="com.cn.service.OrdersService">
       	<property name="orderDao" ref="orderDao"></property>
    </bean>
     <bean  id="orderDao" class="com.cn.dao.OrderDao">
           <property name="jdbcTemplate" ref="jdbcTemplate"></property>
     </bean>
    <bean  id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
           <property name="dataSource" ref="dataSource"></property>
    </bean>
</beans></beans>

OrderDao.java

package com.cn.dao;

import org.springframework.jdbc.core.JdbcTemplate;

public class OrderDao {
	//注入jdbcTemplate
	private JdbcTemplate  jdbcTemplate;
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	/**
	 * 做对数据库操作的方法,不写业务操作
	 * 
	 */
	//少钱的方法
	public  void  lessMoney(){
		String sql=" update account set salary=salary-?  where username=?";
		jdbcTemplate.update(sql, 100, "小王");
	}
	
	//小马多钱的方法
	public void moreMoney(){
		String sql=" update account set salary=salary+?  where username=?";
		jdbcTemplate.update(sql, 100, "小马");
	}
}

OrdersService.java
 

package com.cn.service;

import org.springframework.transaction.annotation.Transactional;

import com.cn.dao.OrderDao;
@Transactional
public class OrdersService {
	private OrderDao  orderDao;
	public void setOrderDao(OrderDao orderDao) {
		this.orderDao = orderDao;
	}
	//调用dao的方法
	//业务逻辑层,写转账业务
	public void accountMoney(){
		//小王少100
		orderDao.lessMoney();
		int  i=1/0;
		//小马多100
		orderDao.moreMoney();
	}
}

测试类
package com.cn.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestService {
	@Test
	public void testDemo(){
		ApplicationContext context=
				new ClassPathXmlApplicationContext("bean3.xml");
		OrdersService  service=(OrdersService) context.getBean("ordersService");
		service.accountMoney();
	}
}



 

发布了164 篇原创文章 · 获赞 1 · 访问量 2685

Guess you like

Origin blog.csdn.net/zhupengqq1/article/details/104099676