【事务】开发用到的事务,TransactionDefinition实例详解,事务的传播机制

一、TransactionDefinition 介绍

TransactionDefinition 是Spring框架中定义事务属性的接口。它提供了定义事务的各种属性和行为的方法,包括事务的隔离级别、传播行为、超时设置等。在Spring中,通过TransactionDefinition可以灵活地配置事务的行为,以满足不同业务场景的需求。

下面是TransactionDefinition接口中常用的属性和方法:

1、隔离级别(Isolation Level):

事务隔离级别常量 ISOLATION_DEFAULTISOLATION_READ_UNCOMMITTEDISOLATION_READ_COMMITTEDISOLATION_REPEATABLE_READISOLATION_SERIALIZABLE 是 Java 中 TransactionDefinition 接口定义的隔离级别常量,用于表示事务的隔离级别。以下是这些隔离级别的具体含义:

  • ISOLATION_DEFAULT:

    表示使用数据库默认的隔离级别。具体隔离级别取决于数据库的配置和默认设置。

  • ISOLATION_READ_UNCOMMITTED:

    该隔离级别允许事务读取未提交的数据,也称为脏读(Dirty Read)。
    其他事务可以修改并提交数据,但是在当前事务读取时尚未提交的数据也可被读取。

  • ISOLATION_READ_COMMITTED:

    该隔离级别确保一个事务只能读取到已提交的数据,禁止脏读(Dirty Read)。
    当一个事务正在读取数据时,其他事务对该数据进行修改并提交,当前事务再次读取该数据时会获取到已提交的最新值。

  • ISOLATION_REPEATABLE_READ:

    该隔离级别确保一个事务在同一事务期间多次读取同一数据时,得到的结果是一致的,不会受其他事务的影响。
    即使其他事务对数据进行了修改并提交,当前事务多次读取同一数据时仍会获取到一致的结果,避免了不可重复读(Non-Repeatable Read)问题。

  • ISOLATION_SERIALIZABLE:

    该隔离级别是最高的隔离级别,确保所有事务按顺序串行执行,避免并发问题。
    当一个事务在执行时,其他事务无法对其涉及的数据进行修改和提交,直到当前事务完成。

这些隔离级别可以根据业务需求和数据库支持的情况来选择合适的级别。一般来说,隔离级别越高,数据一致性和安全性越高,但也可能会影响系统的并发性能。因此,在选择隔离级别时需要根据具体情况进行权衡和考虑。

2、传播行为(Propagation Behavior):

int getPropagationBehavior():获取事务的传播行为,可以是PROPAGATION_REQUIREDPROPAGATION_SUPPORTSPROPAGATION_MANDATORYPROPAGATION_REQUIRES_NEWPROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVERPROPAGATION_NESTED之一。

3、超时设置(Timeout Setting):

int getTimeout():获取事务的超时时间,以秒为单位。如果超过指定时间事务未完成,则会自动回滚。

4、只读属性(Read-Only):

boolean isReadOnly():判断事务是否为只读事务。只读事务不会对数据库进行写操作,可以提高性能。

5、名称(Name):

String getName():获取事务的名称,用于标识事务。
通过使用TransactionDefinition接口,可以在Spring中灵活地配置和管理事务的各种属性,从而实现对数据库操作的精确控制和优化。

三、@Transactional 应用

@Transactional 是 Spring 框架中用于声明事务性方法的注解之一。通过在方法上添加 @Transactional 注解,可以告诉 Spring 在执行该方法时要开启事务,并根据注解的配置来管理事务的提交、回滚等操作。

以下是 @Transactional 注解的一些常见用法和示例:

基本用法:在方法上添加 @Transactional 注解,表示该方法应该在事务管理范围内执行。

import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    
    @Autowired
    private UserDao userDao;

    @Transactional
    public void updateUser(User user) {
        // 执行更新用户操作
        userDao.update(user);
    }
}

在上面的示例中,updateUser 方法被标记为 @Transactional,意味着当调用这个方法时,Spring 会自动为其开启一个事务。

事务属性配置:@Transactional 注解支持配置各种事务属性,例如事务的隔离级别、传播行为、超时设置等。

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, timeout = 30)
public void updateUser(User user) {
    // 执行更新用户操作
    userDao.update(user);
}

在这个示例中,@Transactional 注解配置了事务的隔离级别为 READ_COMMITTED,传播行为为 REQUIRED,超时时间为 30 秒。

异常回滚:默认情况下,@Transactional 注解会在方法抛出 RuntimeException 或其子类时回滚事务。你也可以通过 rollbackFor 属性指定需要回滚的异常类型。

@Transactional(rollbackFor = {SQLException.class, MyCustomException.class})
public void updateUser(User user) throws MyCustomException {
    // 执行更新用户操作
    userDao.update(user);

    if (somethingWentWrong) {
        throw new MyCustomException("Something went wrong!");
    }
}

在这个示例中,如果 updateUser 方法中出现 SQLExceptionMyCustomException 异常,事务会回滚。

总的来说,@Transactional 注解是 Spring 中用于声明事务性方法的便捷方式,通过注解配置可以灵活管理事务的行为和属性,使得事务管理更加方便和可控。

二、TransactionDefinition 应用

假设你正在开发一个基于Spring的Java项目,并且需要在其中使用TransactionDefinition来定义和管理事务属性。以下是一个示例代码,演示了如何在项目中使用TransactionDefinition:

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

<!-- 配置数据源 -->
<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/mydatabase"/>
    <property name="username" value="username"/>
    <property name="password" value="password"/>
</bean>

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

接下来,假设你有一个Service层的类UserService,其中包含了一些对用户数据进行操作的方法,需要使用事务管理:

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

public class UserService {
    private PlatformTransactionManager transactionManager;

    public void setTransactionManager(PlatformTransactionManager transactionManager) {
        this.transactionManager = transactionManager;
    }

    public void updateUser(User user) {
        // 定义事务属性
        TransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // 执行更新用户操作
            userDao.update(user);

            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 发生异常时回滚事务
            transactionManager.rollback(status);
            throw new RuntimeException("更新用户失败", e);
        }
    }
}

在上面的示例中,UserService 类中的 updateUser 方法使用了 TransactionDefinition 来定义事务属性,包括事务的隔离级别、传播行为等。在方法中,首先获取事务管理器并使用事务定义开始事务,然后执行更新用户操作,最后根据操作结果提交或回滚事务。

在实际项目中,你可以根据具体业务需求和数据操作情况,灵活地配置和使用 TransactionDefinition来管理事务,保证数据操作的一致性和完整性。

三、注意事项

一定要注意!!!
spring 事务处理中,同一个类中:A方法(无事务)调B方法(有事务),事务不生效问题。

关注我,下周更新解决办法~

在使用事务时,有一些注意事项可以帮助你确保事务管理的正确性和可靠性:

  • 事务边界:确保事务的边界设置正确,即事务应该包含逻辑上相关的操作,并且不应该跨越多个业务逻辑边界。
  • 事务管理位置:在合适的位置使用事务管理,通常是在 Service 层业务逻辑层进行事务管理,而不是在控制器(Controller)层或DAO层。
  • 事务传播行为:根据业务需求和操作的情况,选择适当的事务传播行为。例如,如果一个方法调用另一个带有事务的方法,可以使用 Propagation.REQUIRED 传播行为。
  • 事务隔离级别:根据业务的并发访问情况和数据一致性要求,选择合适的事务隔离级别。常用的隔离级别包括 Isolation.READ_COMMITTED 和 Isolation.REPEATABLE_READ 等。
  • 异常处理:在事务中对异常进行处理,确保发生异常时事务可以正确回滚。可以使用 rollbackFor
    属性指定需要回滚的异常类型,或者在方法中捕获异常并手动回滚事务。
  • 事务超时:根据业务操作的耗时情况,设置适当的事务超时时间,避免事务长时间持有数据库连接。
  • 只读事务:对于只读操作,使用 @Transactional(readOnly = true) 注解来声明只读事务,可以提高性能。
  • 避免长事务:尽量避免长时间持有事务,以减少数据库锁定时间和资源占用。
  • 并发控制:对于需要并发控制的操作,使用乐观锁或悲观锁等技术来确保数据一致性。
  • 事务测试:在开发过程中进行事务的单元测试,验证事务管理的正确性和可靠性。

三、java其他常用的事务

在Java开发中,事务是管理数据库操作的重要概念之一。以下是在Java开发中常用的事务相关技术和工具:

  • Java Transaction API (JTA):

    JTA 是 Java 平台的事务管理 API,用于管理分布式事务。它提供了 UserTransaction 接口来控制事务的开始、提交和回滚操作。

  • Java Persistence API (JPA):

    JPA 是一种用于对象持久化的Java标准。它可以与 JTA 结合使用,通过注解或 XML 配置来管理实体类的持久化操作,包括事务管理。

  • Spring Framework:

    Spring 框架提供了广泛的事务管理支持。通过 Spring 的声明式事务管理(Declarative Transaction Management)或编程式事务管理(Programmatic Transaction Management),可以很方便地管理事务。

  • Java Database Connectivity (JDBC):

    JDBC 是 Java 提供的用于与数据库交互的标准 API。它可以通过设置事务隔离级别和使用 Connection 对象的 commit()、rollback() 方法来实现事务管理。

  • Spring Data JPA:

    Spring Data JPA 是 Spring 框架的一个模块,提供了对 JPA 的更高级别的抽象和简化。它可以与 Spring 的事务管理结合使用,简化数据访问层的开发,并自动处理事务。

  • Hibernate:

    Hibernate 是一个流行的 ORM 框架,它可以与 JTA 或 Spring
    的事务管理结合使用,实现对数据库操作的事务管理和持久化。

  • Atomikos:

    Atomikos 是一个分布式事务管理器,可以用于管理跨多个数据库或系统的事务。它提供了可靠的事务管理和故障恢复机制。

这些技术和工具可以根据具体的项目需求和开发环境选择和组合使用,以实现有效的事务管理和数据库操作。

  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值