美文网首页
spring事务用法

spring事务用法

作者: sunpy | 来源:发表于2019-03-24 16:28 被阅读0次

    Spring事务传播范围

    propagation="REQUIRED"
    如果方法运行时,已经处于一个事务之中,那么直接就加入当前事务中,如果没有,那么就创建一个新的事务。
    propagation="REQUIRES_NEW
    不管是否存在新的活动事务,都将会开启一个新的事务。如果一个方法运行多个事务,如果方法运行当前的事务中,那么原事务将挂起。
    propagation="NESTED"
    支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
    propagation="SUPPORTS"
    让当前的方法在一个事务中工作,否则方法在没有任务事务的情况下工作。
    propagation="NOT_SUPPORTED"
    当调用方法时,如果存在一个活动事务,那么该活动事务将被暂停,直到方法调用结束为止。
    propagation="NEVER"
    当调用方法时,如果系统中存在一个活动事务且发生错误,那么必须在系统中没有任何活动事务的情况下调用方法。
    propagation="MANDATORY"
    当调用方法时,如果系统中不存在一个活动事务且发生了错误,必须确保在访问该方法时已经创建了一个事务。

    入门例子

    表设计:name字段不可以为NULL

    CREATE TABLE `single_user` (
      `id` bigint(18) unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(18) NOT NULL,
      `age` int(3) DEFAULT NULL,
      `pwd` varchar(32) DEFAULT NULL,
      `create_time` datetime DEFAULT NULL,
      `modify_time` datetime DEFAULT NULL,
      `deleted` tinyint(4) DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3695758 DEFAULT CHARSET=utf8;
    
    CREATE TABLE `single_vip` (
      `vip_id` bigint(18) unsigned NOT NULL AUTO_INCREMENT,
      `vip_name` varchar(18) NOT NULL,
      `vip_create_time` datetime NOT NULL,
      PRIMARY KEY (`vip_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    <!-- 配置Druid数据库连接池 -->
    <beans:bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <beans:property name="driverClassName" value="${jdbc_driverClass}"></beans:property> 
        <beans:property name="url" value="${jdbc_url}"></beans:property>
        <beans:property name="username" value="${jdbc_username}"></beans:property>
        <beans:property name="password" value="${jdbc_password}"></beans:property>
        <!-- 初始化连接大小 -->
        <beans:property name="initialSize" value="0"></beans:property>
        <!-- 连接池最大使用连接数量 -->
        <beans:property name="maxActive" value="20"></beans:property>
        <!-- 连接池最大空闲 -->
        <beans:property name="maxIdle" value="20"></beans:property>
        <!-- 连接池最小空闲 -->
        <beans:property name="minIdle" value="0"></beans:property>
        <!-- 获取连接最大等待时间 -->
        <beans:property name="maxWait" value="60000"></beans:property>
    </beans:bean>
    
    <beans:bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <beans:property name="dataSource" ref="dataSource"></beans:property>
    </beans:bean>
    
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT" read-only="false"/>
        </tx:attributes>
    </tx:advice>
    
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.spy.single.service.impl.UserServiceImpl.*(..))"/>
    </aop:config>
    

    Mapper:

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="cn.spy.single.dao.UserMapper" >
        <insert id="insert" parameterType="cn.spy.single.model.User">
            INSERT INTO single_user (name, age, pwd, create_time, modify_time, deleted)
            VALUES(
                #{name},
                #{age},
                #{pwd},
                #{createTime},
                #{modifyTime},
                #{deleted}
            )
        </insert>
        
        <insert id="insertVip" parameterType="cn.spy.single.model.Vip">
            INSERT INTO single_vip (vip_name, vip_create_time)
            VALUES(
                #{name},
                #{createTime}
            )
        </insert>
    </mapper>
    
    @Service("userService")
    public class UserServiceImpl extends BaseService implements UserService{
        
        @Resource
        private UserMapper userMapper;
    
        @Override
        public Result insertUser(User user, Vip vip) throws SysException {
            Result result = new Result();
            
            if (user == null) {
                throw new SysException("Hello SysException");
            }
            
            userMapper.insert(user);
            userMapper.insertVip(vip);
            return result;
        }
    }
    

    测试:添加一条name为空的记录和name不为空的记录

    public class SpringTest {
        
        public static void main(String[] args) throws SysException {
            ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
            UserService us = ac.getBean("userService", UserService.class);
            User lyf = new User(null, "刘亦菲", 20, "123456789", new Date(), new Date(), false);
            Vip vip = new Vip(null, null, new Date());
            us.insertUser(lyf, vip);
        }
    }
    

    结果:



    注解方式

    <?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:aop="http://www.springframework.org/schema/aop" 
        xmlns:beans="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans   
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
        http://www.springframework.org/schema/context  
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
        
        <context:property-placeholder location="classpath:/config.properties" />
        
        <!-- 配置Druid数据库连接池 -->
        <beans:bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
            <beans:property name="driverClassName" value="${jdbc_driverClass}"></beans:property> 
            <beans:property name="url" value="${jdbc_url}"></beans:property>
            <beans:property name="username" value="${jdbc_username}"></beans:property>
            <beans:property name="password" value="${jdbc_password}"></beans:property>
            <!-- 初始化连接大小 -->
            <beans:property name="initialSize" value="0"></beans:property>
            <!-- 连接池最大使用连接数量 -->
            <beans:property name="maxActive" value="20"></beans:property>
            <!-- 连接池最大空闲 -->
            <beans:property name="maxIdle" value="20"></beans:property>
            <!-- 连接池最小空闲 -->
            <beans:property name="minIdle" value="0"></beans:property>
            <!-- 获取连接最大等待时间 -->
            <beans:property name="maxWait" value="60000"></beans:property>
        </beans:bean>
        
        <!-- 指定注解方式实现事务 -->
        <tx:annotation-driven transaction-manager="txManager"/>
        
        <!-- 配置事务管理器类 -->
        <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"></property>
        </bean>
    </beans>
    
    @Service("userService")
    public class UserServiceImpl extends BaseService implements UserService{
        
        @Resource
        private UserMapper userMapper;
        
        @Transactional
        @Override
        public Result insertUser(User user, Vip vip) throws SysException {
            Result result = new Result();
            
            if (user == null) {
                throw new SysException("Hello SysException");
            }
            
            userMapper.insert(user);
            userMapper.insertVip(vip);
            return result;
        }
    }
    

    测试结果:


    相关文章

      网友评论

          本文标题:spring事务用法

          本文链接:https://www.haomeiwen.com/subject/aetyvqtx.html