只读事务是否做无用功?

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

@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操作。
  • 只读事务的场景,如统计,保证统计结果准确性。
  • 缺点,使用事务,动态生成代理类,增加开销。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水木江南

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

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

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

打赏作者

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

抵扣说明:

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

余额充值