16:事务-Java Spring

简介: 16:事务-Java Spring

16.1 Spring事务管理原理

Spring事务管理基于AOP(面向切面编程)实现,通过拦截方法调用,对业务逻辑进行增强,确保事务的正确开启、提交或回滚。其核心组件包括:

  1. PlatformTransactionManager:事务管理器接口,定义了管理和控制事务的基本操作。具体实现如DataSourceTransactionManager(针对JDBC)、HibernateTransactionManager(针对Hibernate)等。
  2. TransactionDefinition:事务定义接口,描述事务的属性,如隔离级别、传播行为、超时时间、是否只读等。
  3. TransactionStatus:事务状态接口,用于查询和控制事务的状态。

16.2 Spring事务配置与代码示例

Spring事务可以通过XML配置、注解驱动等方式进行配置。以下为注解驱动的示例:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    @Transactional(rollbackFor = Exception.class)
    public void createUser(String name, String email) {
        User user = new User(name, email);
        userRepository.save(user);
        // 模拟抛出异常,触发事务回滚
        if ("error@example.com".equals(email)) {
            throw new IllegalArgumentException("Invalid email");
        }
    }
}

在上述代码中,@Transactional注解标记了createUser方法为一个事务方法。当该方法内发生未被捕获的异常时,Spring会自动回滚事务,保证数据的一致性。

16.3 事务策略的区别

隔离级别:SQL标准定义了四种隔离级别(读未提交、读已提交、可重复读、串行化),分别对应不同的并发问题(脏读、不可重复读、幻读)。Spring允许开发者根据业务需求调整隔离级别。

  • DEFAULT:由数据库决定。
  • READ_UNCOMMITTED:最低隔离级别,可能发生脏读、不可重复读、幻读。
  • READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。
  • REPEATABLE_READ:避免脏读、不可重复读,但可能出现幻读。
  • SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。
@Service
public class TransactionalService {
    // READ_COMMITTED:避免脏读,但可能出现不可重复读、幻读。
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void readCommittedTransaction() {
        // 执行业务逻辑...
    }
    // SERIALIZABLE:最高隔离级别,完全避免并发问题,但可能导致性能下降。
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void serializableTransaction() {
        // 执行业务逻辑...
    }
}

传播行为:定义了当前方法事务如何与已有事务(如果存在)交互。常见的传播行为有:

  • REQUIRED:若当前存在事务,则加入该事务;否则创建新事务。
  • REQUIRES_NEW:无论当前是否存在事务,均创建新事务。原事务挂起。
  • SUPPORTS:若当前存在事务,则加入该事务;否则以非事务方式执行。
  • NOT_SUPPORTED:以非事务方式执行,若当前存在事务,则挂起。
@Service
public class TransactionalService {
    @Autowired
    private AnotherService anotherService;
    // REQUIRED:如果当前存在事务,则加入该事务;否则创建新事务。
    @Transactional(propagation = Propagation.REQUIRED)
    public void requiredTransaction() {
        // 执行业务逻辑...
        anotherService.someMethod();
    }
    // REQUIRES_NEW:总是新建事务,当前事务(若有)挂起。
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void requiresNewTransaction() {
        // 执行业务逻辑...
    }
    // NEVER:不能在事务环境下执行,否则抛出异常。
    @Transactional(propagation = Propagation.NEVER)
    public void neverTransaction() {
        // 执行业务逻辑...
    }
}

超时设置:指定事务可以持续的最长时间,防止事务长时间阻塞资源。

只读标志:声明事务为只读,数据库可能据此优化查询性能,某些数据库在只读事务中不允许执行更新操作。

@Service
public class TransactionalService {
    @Transactional(readOnly = true)
    public void readOnlyTransaction() {
        // 执行只读查询操作...
    }
}

16.4 Spring事务应用场景总结

  1. 数据密集型业务:如银行转账、订单处理、库存管理等,涉及多个数据库操作,必须保证事务的ACID特性以维护数据一致性。
  2. 分布式事务:Spring支持与分布式事务解决方案(如两阶段提交、Saga模式、Seata等)集成,适用于微服务架构中的跨服务数据一致性问题。
  3. 批量操作:对于大量数据的插入、更新、删除等操作,使用事务可以确保操作的原子性,避免部分成功导致的数据不一致。
  4. 幂等性保障:对于需要保证幂等性的接口(如支付、退款等),利用事务可以确保在并发请求下,多次相同的请求对系统状态的影响与一次请求相同。

总结,Spring事务管理为开发者提供了便捷、强大的事务控制工具。理解其原理、掌握配置与使用方法,并依据业务场景选择合适的事务策略,是构建健壮、可靠的企业级应用的关键。


目录
相关文章
|
10天前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
40 0
|
8天前
|
监控 Java 开发者
Spring Boot框架在java领域的优势
随着云计算、微服务架构的兴起,Java开发领域迫切需要一套高效、灵活且易于上手的框架来应对日益复杂的业务需求。正是在这样的背景下,Spring Boot应运而生,以其独特的魅力迅速成为了Java开发者手中的利器。
20 3
|
8天前
|
Java 数据库连接 API
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
|
9天前
|
安全 前端开发 Java
Java技术栈中的核心组件:Spring框架
Java作为一门成熟的编程语言,其生态系统拥有众多强大的组件和框架,其中Spring框架无疑是Java技术栈中最闪耀的明星之一。Spring框架为Java开发者提供了一套全面的编程和配置模型,极大地简化了企业级应用的开发流程。
18 1
|
12天前
|
人工智能 移动开发 Java
Java智能之Spring AI:5分钟打造智能聊天模型的利器
尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架。随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代。从智能语音助手到复杂的自然语言处理系统,人工智能已经成为了现代生活和工作中不可或缺的一部分。在这样的背景下,Spring AI 项目迎来了发展的机遇。尽管该项目汲取了Python项目如LangChain和LlamaIndex的灵感,但Spring AI并不是简单的移植。该项目的初衷在于推进生成式人工智能应用程序的发展,使其不再局限于Python开发者。
27 2
|
16天前
|
消息中间件 Java BI
使用Java和Spring Batch实现批处理
使用Java和Spring Batch实现批处理
|
8天前
|
Java Spring
spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
8天前
|
XML Java 关系型数据库
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景
|
13天前
|
Java 数据库 索引
【Java】已解决Spring框架中的org.springframework.dao.DuplicateKeyException异常
【Java】已解决Spring框架中的org.springframework.dao.DuplicateKeyException异常
15 0
|
13天前
|
Java Spring
解析Spring Boot中的事务管理机制
解析Spring Boot中的事务管理机制