首页 > 其他分享 >【学习笔记】Spring声明式事务

【学习笔记】Spring声明式事务

时间:2023-02-18 13:34:44浏览次数:34  
标签:事务 deleteUser tx spring Spring 用户 笔记 标签

Spring声明式事务

事务的概念

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务应该具有ACID原则:

  • 原子性:事务中的操作要么都发生,要么都不发生

  • 一致性:事务前后的数据完整性要保持一致

  • 隔离性:多个用户并发访问数据库,数据库为每一个用户开启一个事务,不能被其他事务的操作干扰,多个并发事务之间要互相隔离

  • 持久性:事务一旦提交则不可逆,被持久化到数据库中。

简单来说:把一组业务当作一个业务,要么都成功,要么都失败。

下面通过例子来了解事务:我们把查找用户、增加用户、删除用户当作一个业务来做,然后故意在删除用户的sql制造错误,看看增加用户能否成功。

public List<User> selectUser() {
​
    addUser(new User(5,"大张三","221133","221133@11",new Date(145235286565L)));
​
    deleteUser(8);
​
    return getSqlSession().getMapper(UserMapper.class).selectUser();
}
​
@Override
public int addUser(User user) {
    getSqlSession().getMapper(UserMapper.class).addUser(user);
    return 0;
}
​
@Override
public int deleteUser(int id) {
    getSqlSession().getMapper(UserMapper.class).deleteUser(id);
    return 0;
}

我们在selectUser()方法中调用addUser() 和 deleteUser() 把他们当成一组事务。

<delete id="deleteUser" parameterType="_int">
    deletes from users where id = #{id}
</delete>

故意把delete语句写错

结果是增加用户成功了,删除用户没有成功,按照事务的原则,增加用户也不应该成功,原因是在这个项目中没有开启事务。下面我们通过spring来开启事务。

 

spring事务管理

在spring中有两种事务

  • 声明式事务:通过AOP横切,不影响原有代码

  • 编程式事务:通过对原有代码进行改变,不推荐使用

 

  1. 在配置文件中配置声明式事务

    通过注册bean的方式,class是spring提供的DataSourceTransactionManage,需要注入的属性就是上面注册的dataSource

    <!--    配置声明式事务-->
    <bean id="transactionManage" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
  2. 结合AOP实现事务的织入

    首先需要先配置事务的通知,利用的是 tx:advice标签(事务专用标签),这个标签需要上面新注册的事务管理器transactionManage

    在 tx:advice标签 里面需要用到 tx:attribute标签来汇总 tx:method标签

    tx:method 就代表给哪些方法配置事务,可以用*代替,还可以配置事务的传播特性propagation

    <!--    结合AOP实现事务的织入-->
    <!--    配置事务通知-->
        <tx:advice transaction-manager="transactionManage">
            <tx:attributes>
                <tx:method name="*" propagation="REQUIRED"/>
            </tx:attributes>
        </tx:advice>

    需要注意的是:使用tx标签需要引入tx的依赖

  3. 配置事务的切入

    <!--    配置事务切入-->
    <aop:config>
        <aop:pointcut id="txPointCut" expression="execution(* com.wang.mapper.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>
  4. 再次测试

    测试结果是没有将用户添加到数据库,删除用户也没有成功,这就达到了我们预期的结果

     

标签:事务,deleteUser,tx,spring,Spring,用户,笔记,标签
From: https://www.cnblogs.com/wztblogs/p/17132406.html

相关文章

  • org.springframework.beans.factory.NoUniqueBeanDefinitionException:expected singl
    这是因为从bean容器中找到的bean不是唯一的,找到了2个匹配的bean,这时候注入bean就会报错。比如说一个service接口有两个实现类  一、@Autowired方式注入    ......
  • 事务基础知识与执行计划
    事务基础知识数据库事务的概念数据库事务是什么?事务是一组原子性的SQL操作。事务由事务开始与事务结束之间执行的全部数据库操作组成。A(原子性)、(C一致性)、I(隔离性)、D(持......
  • SpringBoot 官方文档示例(90):整合jpa时,自定义名称映射
    在SpringBoot整合jpa时默认将实体类的名称的驼峰映射成下划线的表名。也就是使用CamelCaseToUnderscoresNamingStrategy。可以通过自定义的方式来指定上述的映射规则,可以......
  • SpringBoot 官方文档示例(89):使用DataSourceBuilder构建数据源
    一、在application.properties中配置数据源信息app.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.datasource.jdbcUrl=jdbc:mysql://xxx.xxx.xxx.xxx/testapp.data......
  • SpringBoot 官方文档示例(88):配置logback把日志写到文件
    一、配置日志文件名logging.file.name=myapplication.log二、在resources下创建logback-spring.xml配置文件<?xmlversion="1.0"encoding="UTF-8"?><configuration><in......
  • SpringBoot: 自定义HttpMessageConverter
    一、定义类继承自AbstractHttpMessageConverterpackagecn.edu.tju.config;importcn.edu.tju.UserInfo;importorg.springframework.http.HttpInputMessage;importorg.spr......
  • Spring Boot Redis 应用场景
    1.前言Redis其实就是基于内存的键值型数据库,与Oracle、SQLServer、MySQL等传统关系型数据库相比,它最大的优势就是读写速度快。到底有多快呢,我曾经使用Windows版......
  • 阅读笔记——架构漫谈
    这学期学习了软件体系结构这门课,想要做出好的软件,就需要在制作过程中对整个软件系统进行设计,引入软件架构的概念,为此阅读了王概凯的架构漫谈,得出了以下体会。上个......
  • 官方文档阅读笔记(二)2.安装 Djnago
    前提条件安装Python而且Python自带轻量级数据库SQLite。设置数据库也可以不设置默认使用SQLitePostgreSQL。你也可以使用MariaDB、MySQL或者Oracle......
  • 啥是Spring全家桶?
    啥是Spring全家桶?Spring全家桶大概包含了Spring、Springmvc、Springboot以及Springcloud。那这些又是干嘛的呢?首先,先了解Spring!Spring是一个开发Java的轻量级(文件小)框......