Spring之声明式事务(十一)_(YSY_YSY)的博客-程序员宅基地

技术标签: # Spring  

Spring之声明式事务

1.回顾事务

  • 把一组业务当成一个业务来做;要么都成功,要么都失败!
  • 事务在项目开发中,十分的重要,涉及到数据的一致性问题,不能马虎!
  • 确保完整性和一致性;

事务ACID原则:

  • 原则性
  • 一致性
  • 隔离性
    • 多个业务可能操作同一个资源,防止数据损坏
  • 持久性
    • 事务一旦提交,无论系统发生什么问题,结果都不会再被影响,被持久化的写到存储器中!

2.spring中的事务管理

  • 声明式事务:AOP
  • 编程式事务:需要再代码中,进行事务的管理

配置事务的代码:

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

    <!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
      我们这里使用Spring提供的JDBC:org.springframework.jdbc.datasource-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url"
                  value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
    <!-- sqlSessionFactory  -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"></property>
        <!--        绑定Mybatis配置文件-->
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:com/yang/mapper/*.xml"/>
    </bean>
    <!--SqlSessionTemplate:就是我们使用的sqlSession   -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!--       只能使用构造器sqlSessionFactory,因为它没有set方法 -->
        <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
    </bean>
    <!--   配置声明式事务 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="datasource"></property>
    </bean>
    <!--    结合AOP实现事务的织入-->
    <!--    配置事务通知:-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--      给哪些方法配置事务  -->
<!--        配置事务的传播特性:new propagation= -->
        <tx:attributes>
            <tx:method name="add" propagation="REQUIRED" />
            <tx:method name="delete" propagation="REQUIRED"/>
            <tx:method name="update" propagation="REQUIRED"/>
            <tx:method name="query" read-only="true"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>
<!--    配置事务的切入-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.yang.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"></aop:advisor>
    </aop:config>
</beans>

UserMapper.xml

<mapper namespace="com.yang.mapper.UserMapper">
    <select id="selectUser" resultType="user">
        select * from mybatis.user;
    </select>
    <insert id="addUser" parameterType="user">
        insert into mybatis.user (id,name,pwd) values (#{id},#{name},#{pwd});
    </insert>
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id=#{id}
    </delete>
</mapper>

UserMapperImpl

    public List<User> selectUser() {
    
        User user = new User(3, "小王", "2131231");
        UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
        mapper.addUser(user);
        mapper.deleteUser(2);
        return mapper.selectUser();

    }

思考:
为什么需要事务?

  • 如果不配置事务,可能存在数据提交不一致的情况下;
  • 如果我们不在spring中去配置声明式事务,我们就需要在代码中手动配置事务!
  • 事务在项目的开发中十分重要,设计到数据的一致性和完整性问题,不容马虎!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_50231389/article/details/117729606

智能推荐

jpa学习和jpa与spring整合(二)_jpa和spring集成-程序员宅基地

经过上一篇介绍了jpa的用法和原理:这一篇开始整合jpa与spring整合。一.配置applicationContext.xmlxml version="1.0" encoding="UTF-8"?>beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/200_jpa和spring集成

牛客小白月赛12 J 月月查华华的手机(序列自动机)-程序员宅基地

---恢复内容开始---题目来源:https://ac.nowcoder.com/acm/contest/392/J题意:题目描述 月月和华华一起去吃饭了。期间华华有事出去了一会儿,没有带手机。月月出于人类最单纯的好奇心,打开了华华的手机。哇,她看到了一片的QQ推荐好友,似乎华华还没有浏览过。月月顿时醋意大发,出于对好朋友的关心,为了避免华华浪费太多时间和其他网...

android音乐16bit,16bit音乐是无损吗-程序员宅基地

16bit的音乐是否是无损需要看它的格式,如果是标准CD的音乐那么它就是无损的,如果是HDCD或者是专业音频,16bit就不一定是无损的。所谓无损音乐指的是没有经过压缩处理的,但是对它的量化却没有严格的标准,很多音乐都可以称为无损,但不是说只要16bit就是无损。16bit音乐是无损吗1、16bit有些是无损的,有些则不是无损的,因为音乐会有很多种格式,有些格式的音乐中16bit就是无损,比如说标..._音频16bit

select into from 和 insert into select的使用_select into from 用法_Spring的思念的博客-程序员宅基地

select into from 和 insert into select 都是用来复制表,阐述了晾着的区别。_select into from 用法

zzuli OJ 1032: 员工薪水-程序员宅基地

Description 某公司规定,销售人员工资由基本工资和销售提成两部分组成,其中基本工资是1500元/月,销售提成规则如下: 销售额小于等于10000元时,按照5%提成; 销售额大于10000元但小于等于50000元时,超出10000部分按照3%提成; 销售额...

【毕业设计】 大数据地铁客流数据分析系统 - python_python地铁数据分析-程序员宅基地

Hi,大家好,这里是丹成学长的毕设系列文章! 对毕设有任何疑问都可以问学长哦!这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是地铁大数据客流分析系统学长这里给一个题目综合评分(每项满分5分)难度系数:4分工作量:4分创新点:3分。_python地铁数据分析

随便推点

使用docker-19.03.14搭建hadoop-2.9.2完全分布式集群-之一-规划和环境_docker hadoop:2.9-程序员宅基地

集群规划在宿主机上安装 docker,在 docker 上部署 4 个容器,包括 3 个 hadoop 节点和 1 个客户端。使用 mysql 来存放 hive 的 metadata 元数据。宿主机IP: 192.168.109.128docker 网络: 172.18.0.1/24ContainerIPRolehadoop11172.18.0.11NameNode,SecondaryNameNode,ResourceManager,JobHistory,DataNode_docker hadoop:2.9

【建行】龙支付新老用户赚200元详细教程-程序员宅基地

截至本月31日结束! 新用户开通龙支付:4000积分 消费9笔:36000积分 转账9笔:19000积分 取现9笔:19000积分 交易满500元:60000积分 1.完成消费和满500元的任务 下载“中国建设银行”app登录,点击“龙支付”-“扫一扫”,扫自己的云闪付商户收款码 每次付款60元,共8笔,再付款20元,共1笔,这样刚好完成“消费9笔”...

resultType与parameterType的不同以及resultMap和resultType的不同,parameterMap和parameterType的不同_resultype和parametertype-程序员宅基地

resultType与parameterType:resultType一般用于查询操作,parameterType一般用于增删改操作。id与接口方法一致resultType和resultMap两者都是用来表示查询结果集和java对象之间的一种关系,将查询结果集按某种关系,映射到java对象。resultType表示的是对象类,不用映射到bean对象属性中,但是结果集中属性要与bean对象..._resultype和parametertype

gradient clipping_gradient_clipping-程序员宅基地

问题起与这篇知乎:训练到一定epoch之后,突然loss为Nan,其中一种方法说 梯度截断。我觉得我LSTM可能会出现这个问题。https://www.zhihu.com/question/49346370梯度消失(vanishing gradient)与梯度爆炸(exploding gradient)(1)梯度不稳定问题:什么是梯度不稳定问题:深度神经网络中的梯度不稳定性,前面层..._gradient_clipping

jzmq-程序员宅基地

这个鸟东西,整起来太费事了,在编译前先下载个VS2008吧,我特么用的VS2012,工程导入不了,最后下载了个08.其中主要参考下面这个链接http://www.distream.org/?p=436注意:1.如果你的系统是64位的,在安装VS前,把64位编译选上,如果忘记了,也没有事,重新打开VS安装程序,添加选中就行了。我一开始没有注意这个,编译出来的动态链接库不能用,编译

ES6基础知识点_你很棒滴的博客-程序员宅基地

babel为js的编译器,可以把es6代码转化成es5代码,从而让浏览器支持let 1.不能变量提升(只针对于let以后的代码,不能控制以前),2.let 是块作用域,3.不能重复声明。const 声明常量,一旦被定义,无法被修改,其他特性与let一样模板字符串:使用tab键上面的反应号··,插入变量时用${变量名}function(obj,…keys){} 可以用…keys代表剩余参数symbol 表示独一无二的值,用来定义私有属性,取值时一定要用[]取值set 函数set.add(),se._es6基础