18-spring声明式事务

一、简介

事务是数据库操作的最小单元,是作为单个逻辑工作单元执行的一系列操作。事务本身具有原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Isolation)

  • 原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
  • 一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。 一致性是事务的最终目的,其他三个特性是保证一致性的约束
  • 隔离性(Isolation) 事务之间是相互独立, 互不干扰的
  • 持久性(Isolation) 事务的结果是要被持久化的

二、spring 声明式事务依赖

配置声明式事务需要的依赖包括 spring的核心依赖、aop的相关依赖以及springjdbc、spring-tx

<properties>
        
        <spring.version>4.3.9.RELEASEspring.version>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-beansartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-coreartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-contextartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-expressionartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-testartifactId>
            <version>${spring.version}version>
        dependency>
        
        <dependency>
            <groupId>commons-logginggroupId>
            <artifactId>commons-loggingartifactId>
            <version>1.2version>
        dependency>
        
        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>druidartifactId>
            <version>1.1.23version>
        dependency>
        
        <dependency>
            <groupId>mysqlgroupId>
            <artifactId>mysql-connector-javaartifactId>
            <version>8.0.21version>
        dependency>
        
        <dependency>
            <groupId>junitgroupId>
            <artifactId>junitartifactId>
            <version>4.13version>
        dependency>

        
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aopartifactId>
            <version>${spring.version}version>
        dependency>
        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-aspectsartifactId>
            <version>${spring.version}version>
        dependency>
        
        <dependency>
            <groupId>cglibgroupId>
            <artifactId>cglib-nodepartifactId>
            <version>3.3.0version>
        dependency>
        
        <dependency>
            <groupId>aopalliancegroupId>
            <artifactId>aopallianceartifactId>
            <version>1.0version>
        dependency>

        
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-jdbcartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-ormartifactId>
            <version>${spring.version}version>
        dependency>
        <dependency>
            <groupId>org.springframeworkgroupId>
            <artifactId>spring-txartifactId>
            <version>${spring.version}version>
        dependency>
    dependencies>

三、声明式事务配置

配置声明式事务需要配置数据源、事务管理器同时需要开启spring基于注解的事务开关


    <context:property-placeholder location="classpath:application.properties" />
    
    <bean id="datasource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="driverClassName" value="${jdbc.driverClassName}" />
    bean>
    
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <constructor-arg ref="datasource"/>
    bean>
    
    <tx:annotation-driven transaction-manager="transactionManager"/>

其中tx是spring事务的命名空间,需要在对应的xml文件头中将tx命名空间引入进来

四、测试

spring 事务的使用仅仅只需要在需要使用事务的方法上添加@Transactional即可 如果是有事务的service实际上执行的是对应的代理类对象

@Service
public class PayService {

    @Autowired
    private PayDao payDao;

    @Autowired
    private StockDao stockDao;

    @Transactional
    public void pay(Pay pay){

        /**
         * ....... 此处葫芦参数校验 等等业务逻辑
         */
        Stock stock = stockDao.getStockByProductId(pay.getProductId()); //获取现在的库存
        if(stock.getNumber() >= pay.getNumber()){  //表示现在还有库存 可以购买
            // stock.getNumber() - pay.getNumber(), 库存数量减去购买数量
            stockDao.reduceStock(stock.getNumber() - pay.getNumber(), stock.getProductId()); //
            handleOtherBiz(); //其他的业务逻辑
            payDao.addPay(pay); //新增支付记录
        }
    }

    public void handleOtherBiz(){
        throw new RuntimeException("支付业务处理异常");
    }
}

你可能感兴趣的:(spring)