【Spring 框架自学】Day07(事务管理)已完结--2022/4/8

Spring的事务注解管理(事务管理)

Spring开启事务,只适合中小型项目的开发,有两大步骤:

  • 声明事务管理器:DataSourceTransactionManager
  • 连接数据库,指定数据源(事务的提交回滚)
  • 开启事务注解驱动:annotation-driven(导入后缀为tx的)
  • 传入事务管理器的id
//定义实体类映射数据库

//定义持久层Dao接口,书写方法
<!--用Mybatis映射持久层实现方法-->
//定义业务层Service接口,定义接口实现类
<!--配置Spring容器-->

<!-- 1 .声明database配置文件:property-placeholder-->

<!-- 2 .声明数据源,连接数据库 :DruidDataSource
		<!--声明数据库连接的信息:property
				<!--数据库最大连接数:property
-->

<!-- 3 .声明SqlSessionFactory:SqlSessionFactoryBean
	 3.1 传入数据源:dataSource
  	 3.2 mybatis配置文件交给spring容器管理:configLocation
-->


<!-- 4 .将持久层(Dao)交给Spring容器管理,创建Mapper对象:MapperScannerConfigurer
	 4.1 传入SqlSession,得到getMapper()方法:sqlSessionFactoryBeanName
	 4.2 指定持久层(Dao)所在的包名,并为每个Mapper创建对象:basePackage
	
		MapperScannerConfigurer属性:会为所有Dao层接口执行getMapper()方法
-->

<!-- 5 .创建Service对象,将Dao层对象赋予给Service层:property
		实现功能、层级的分离
-->

<!--声明事务管理器对象:DataSourceTransactionManager-->
<bean id = "tranSactionManager" class = "...DataSourceTransactionManager">
	<!--传入数据源:dataSource-->
</bean>

<!--开启事务注解驱动-->
<tx:annotation-driven  transaction-manager="传入声明事务管理器对象"></tx:annotation-driven>
//Service接口实现类在public上加入注解
/*
    @Transactional(
            propagation = Propagation.REQUIRED,
            isolation = Isolation.DEFAULT,
            readOnly = false,
            rollbackFor = {
                    NullPointerException.class,Exception.class
            }
    )
    */
    //@Transactional
    @Override
    public void buyGoods(Integer id, Integer nums) {
        //购买商品
        Sale sale = new Sale();
        sale.setGid(id);
        sale.setNums(nums);
        saleMapper.insertSale(sale);

        //对商品进行查询 让后进行更新
        Goods goods = goodsMapper.selectGoods(id);
        if (goods == null){
            throw new NullPointerException(id+"商品不存在");
        }else if (goods.getAmount() < nums){
            throw new Exception(id+"商品数量不足");
        }
        Goods buyGoods = new Goods();
        buyGoods.setId(id);
        buyGoods.setAmount(nums);
        goodsMapper.updateGoods(buyGoods);
    }

AspectJ的事务注解管理(事务管理)

/*
	省略Spring容器配置之前的所有配置,同上,无任何改变
*/
<!--配置Spring容器-->

<!--声明事务管理器对象:DataSourceTransactionManager-->
<bean id = "transactionmanager" class = "...DataSourceTransactionManager"></bean>

<!--开启事务注解驱动-->
<tx:advice id = "myAdvice" transaction-manager="传入声明事务管理器对象">
    <!--配置事务的属性-->
    <tx:attributes>
	<!--给具体方法配置事务,且method可以拥有多个
		name:完整的方法名称,也可以用通配符*代替
        propagation:传播行为
        isolation:隔离级别
        rollback-for:你指定的异常类名(全限定类名),遇到异常时回滚
	-->
            <tx:method name = "方法名" propagation="REQUIRED" isolation="DEFAULT"
    	rollback-for="java.lang.NullPointerException,com.springexer.Except.Exception">				</tx:method>
        </tx:attributes>
</tx:advice>

<!--配置aop((Aspect注解方法)-->
<aop:config>
    <!--找到文件所在地
            com.xx.service
            com.xxx.service
            com.service
        -->
    <aop:pointcut id="myPt" expression="execution(* *..Service.*.*(..))"/>

    <!--配置增强器:关联advice和pointcut
            advice-ref:绑定事务注解驱动
            pointcut-ref:切入点表达式的id
        -->
    <aop:advisor advice-ref="myAdvice" pointcut-ref="myPt"></aop:advisor>
</aop:config>

Spring集成Mybatis与Web

回头再看

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...