• 事务-Java Spring


    Java Spring框架中,事务管理是非常重要的部分。事务允许我们将多个数据库操作组合成一个单一的工作单元。这样,要么所有操作都成功执行,要么所有操作都回滚(撤销)。Spring通过声明式事务管理和编程式事务管理两种方式提供了强大的事务支持。

    以下是一个使用Spring框架进行声明式事务管理的详细代码介绍:

    1. 添加依赖

    首先,你需要在项目的pom.xml文件中添加Spring框架和数据库相关的依赖。例如,如果你使用Maven,你可能需要添加以下依赖:

    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-contextartifactId>
        <version>你的Spring版本version>
    dependency>
    
    
    <dependency>
        <groupId>org.springframeworkgroupId>
        <artifactId>spring-jdbcartifactId>
        <version>你的Spring版本version>
    dependency>
    
    
    <dependency>
        <groupId>com.mysql.cjgroupId>
        <artifactId>mysql-connector-javaartifactId>
        <version>你的MySQL驱动版本version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    2. 配置数据源和事务管理

    在Spring的配置文件中(如applicationContext.xml),你需要配置数据源和事务管理器。

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           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/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd">
    
        
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://localhost:3306/your_database"/>
            <property name="username" value="your_username"/>
            <property name="password" value="your_password"/>
        bean>
    
        
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource"/>
        bean>
    
        
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
        
    
    beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    3. 使用@Transactional注解

    在你的服务层(Service Layer)中,你可以使用@Transactional注解来标记需要事务支持的方法。

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    @Service
    public class UserService {
    
        @Autowired
        private UserDao userDao;
    
        @Transactional
        public void createUserAndLog(User user) {
            userDao.createUser(user); // 数据库操作1
            logUserCreation(user); // 假设这是一个可能抛出异常的日志记录操作
        }
    
        private void logUserCreation(User user) {
            // 模拟一个可能抛出异常的日志记录操作
            if (/* some condition */) {
                throw new RuntimeException("Logging failed!");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    在上面的示例中,createUserAndLog方法被标记为@Transactional,这意味着如果logUserCreation方法抛出异常,那么userDao.createUser(user)所做的数据库操作也会被回滚。这样,就确保了数据的完整性和一致性。

    注意,你也可以在类级别使用@Transactional注解,这样该类中的所有公共方法都将使用相同的事务配置。

    4. 测试

    你可以编写单元测试或集成测试来验证事务是否按预期工作。例如,你可以模拟logUserCreation方法抛出异常的情况,并检查createUser方法是否没有向数据库添加任何数据。

    这只是一个简单的示例,实际项目中可能需要更复杂的配置和更精细的事务管理策略。但希望这个示例能给你一个关于如何在Spring中使用声明式事务管理的清晰概念。

  • 相关阅读:
    【Java】数据类型转换入门
    世界上最便宜好用的服务器低至 $9.99 / 年
    sql优化
    Vite+Vue3+Pinia+pnpm项目开发快速入门
    十一、MySQL日志
    Linux环境实现mysql所在服务器定时同步数据文件到备份服务器(异地容灾备份场景)
    Kibana:摄入 GeoJSON 数据
    LeetCode - 解题笔记 - 216 - Combination Sum III
    深入探讨QUIC的工作原理,它是如何改善网络性能的?
    Android 全栈的进击之路
  • 原文地址:https://blog.csdn.net/weixin_43784341/article/details/138152399