@Transactional的readOnly、timeout

本文详细解析了Spring框架中@Transactional注解的两个关键属性:readOnly和timeout。介绍了readOnly属性如何提升只读操作的性能,并提供了使用场景示例;同时解释了timeout属性的作用,即如何设定事务超时来避免长时间运行的事务。

@Transactional的readOnly、timeout

1、@Transactional的readOnly

在使用@Transactional注解的时候,有一个属性是readOnly,默认值是false

readOnly的意思就是当前的方法是只读的,也就是说当前的方法中没有需要处理事务(insert,update,delete的操作。则可以加上readOnly=true

使用它的好处是Spring会把你优化这方法,使用了readOnly=true,也就是使用了一个只读的connection。效率会高很多

例如:如下方法,userAdd肯定用到了insert操作。此时加上readOnly=true的话则会报错,插入不成功。

1
2
3
4
@Transactional(readOnly=true)
public void userAdd(User user) {
    userDao.userAdd(user);
}

readOnly的使用场景:

1、只有查询操作的方法上(查询量比较大)

2、确保当前方法不会出现insert,update,delete情况时,可以使用readOnly=true

3、防止当前方法会出现insert,update,delete

2、@Transactional的timeout

事务的超时时间:Transaction时间太长的话,将它停止掉。默认-1

### 三级标题:Spring @Transactional 注解属性详解 Spring 的 `@Transactional` 注解用于声明事务边界,它允许开发者在方法级别或类级别定义事务行为。通过合理配置其属性,可以提高应用的性能和数据一致性。 #### readOnly `readOnly` 属性用于指定事务是否为只读。当一个方法仅用于查询数据时,将其设置为只读可以提高性能,因为底层数据库可以优化只读事务的操作[^1]。例如: ```java @Transactional(readOnly = true) public User getUserById(Long id) { return userRepository.findById(id); } ``` #### rollbackFor 默认情况下,只有遇到 `RuntimeException` 或 `Error` 时才会触发事务回滚。如果希望在遇到特定的检查型异常(checked exception)时也进行回滚,可以通过 `rollbackFor` 属性来指定。例如: ```java @Transactional(rollbackFor = Exception.class) public void processOrder(Order order) throws Exception { // 处理订单逻辑 } ``` 上述代码中,即使抛出了 `Exception` 类型的异常,事务也会被正确地回滚[^2]。 #### propagation 事务传播行为定义了多个事务方法之间如何相互调用。Spring 提供了多种传播行为,其中最常用的是 `PROPAGATION_REQUIRED`,它表示如果当前存在事务,则加入该事务;否则新建一个事务。例如: ```java @Transactional(propagation = Propagation.REQUIRED) public void placeOrder(Order order) { // 下单逻辑 } ``` 此外,还有其他传播行为如 `PROPAGATION_REQUIRES_NEW`、`PROPAGATION_SUPPORTS` 等,每种都有不同的应用场景。 #### isolation 事务隔离级别决定了事务并发执行时的数据可见性和一致性。Spring 支持五种隔离级别,包括 `ISOLATION_DEFAULT`、`ISOLATION_READ_UNCOMMITTED`、`ISOLATION_READ_COMMITTED`、`ISOLATION_REPEATABLE_READ` 和 `ISOLATION_SERIALIZABLE`。通常推荐使用默认的 `ISOLATION_DEFAULT`,因为它会采用底层数据库的默认隔离级别[^1]。 #### timeout 事务超时时间指定了事务必须在多长时间内完成,否则将被回滚。这个值以秒为单位,默认情况下依赖于底层数据库的设置。例如: ```java @Transactional(timeout = 30) public void updateInventory(Inventory inventory) { // 更新库存逻辑 } ``` #### 示例代码 下面是一个综合示例,展示了如何在一个服务方法中使用多个 `@Transactional` 属性: ```java @Service public class OrderService { @Transactional( readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 30 ) public void createOrder(Order order) throws Exception { // 创建订单逻辑 } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值