只读事务是否做无用功?

有时候,我们会看到代码里面,有如下语句:

@Transactional(ReadOnly=true)

是不是没有用处呢?

其实是有用处的,mysql支持只读事务的。

  • 只读事务内,不能增加、修改、删除内容,否则报Cannot execute statement in a READ ONLY transaction。
  • 只读事务内,只能读取到执行时间点前的内容,期间修改的内容不能读取到。
  • 只读事务作为ORM框架优化执行的一个暗号,比如放弃加锁,或者flush never。

mysql5.6验证过程如下:

1. 建表
create table test(
id int not null default 0,
name varchar(10) not null default ”
) engine=innodb default charset=utf8;
insert into test values (1,’zhangsan’);
2. 开启只读事务
mysql> start transaction read only;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from test where id=1;
+—-+———-+
| id | name |
+—-+———-+
| 1 | zhangsan |
+—-+———-+
1 row in set (0.00 sec)
3. 删除内容
mysql> delete from test where id=1;
ERROR 1792 (25006): Cannot execute statement in a READ ONLY transaction.
报错,只读事务不支持删除内容。
4. 手动修改内容后再读取
mysql> update test set name = ‘ganbo’ where id=1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from test where id=1;
+—-+———-+
| id | name |
+—-+———-+
| 1 | zhangsan |
+—-+———-+
1 row in set (0.00 sec)
只读事务内被修改的内容,感知不到。

总结

  • 只读事务的好处,作为ORM框架优化的暗号,保证读一致性,事务内不允许DML操作。
  • 只读事务的场景,如统计,保证统计结果准确性。
  • 缺点,使用事务,动态生成代理类,增加开销。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
在Spring中,只事务事务是两种不同的事务类型。只事务用于查询操作,不允许对数据库进行修改操作,而事务则可以进行查询和修改操作。 如果需要在只事务中添加写操作,我们可以通过以下步骤进行修改: 1. 确定是否真正需要在只事务中进行写操作。由于只事务的设计初衷是为了提高查询性能和并发度,将写操作加入其中可能会降低性能。 2. 在Spring的事务管理配置文件(如XML配置文件或注解配置类)中,将只事务的isolation属性设置为默认级别或其他适当的级别,以允许写操作。例如,将isolation属性设置为READ_COMMITTED或其他适合的级别。 3. 在需要添加写操作的方法上,添加@Transactional注解或将@Transactional注解的只属性设为false,这将将方法标记为事务。 4. 在方法中进行必要的修改操作,并确保在对数据库进行写操作之前,正确地处理事务的提交和回滚。 需要注意的是,在只事务中添加写操作可能会引发一些问题。如果修改操作发生异常,只事务默认情况下将回滚事务。因此,在添加写操作时,必须确保在出现异常时正确处理事务的回滚和异常处理。 总之,如果需要在Spring的只事务中添加写操作,可以通过调整事务的隔离级别和在方法上添加@Transactional注解来实现。但是需要注意在这个过程中,适当处理事务的提交和回滚来确保数据的一致性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水木江南

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值