查询方法需要使用事务吗

注:事务分为读事务和写事务,这里查询方法应该开启写事务。

查询方法需要使用事务吗?这得看数据库的事务隔离级别,mysql默认是可重复读(Repeatable Read)。

mysql查询当前事务隔离级别:

show variables like 'tx_isolation';

SELECT @@tx_isolation;

可通过命令把隔离级别设置为可重复读:

set tx_isolation='repeatable-read';

当数据库隔离级别是可重复读时,查询方法分两种情况:

1.方法里面只有一条查询语句,此时啥事儿没有,不用开启事务。

2.方法里面有多条查询语句,需要根据业务情况判断是否需要开启事务。

1)案例1:

比如当前有一个需求,需要根据A表和B表来做一个统计报表,这个报表要求在每月底进行统计。

select * from A;

select * from B;

此时在方法中直接执行这两句sql,第一句sql比如查询5秒钟,则第二句sql执行时已经是5秒之后了,执行第一条sql语句的这5秒钟B表可能就已经发生了变化,此时这两句sql不在同一时间维度,则统计的报表不够精确,统计报表应当是在同一时间维度才对。

2)案例2:

如下有账户表(account),其中有三条数据,balance代表账户余额。

create table account(id int,name varchar(20), balance float);

insert into account(1,'小明',10000);
insert into account(2,'小红',30000);
insert into account(2,'小方',80000);

此时有一个方法中执行了如下两条sql语句:

select * from account where id=1;

select * from account where id=2;

我们本来预想的结果是id=1的余额为10000,id=2的余额为30000

当我们执行了第一条sql后,查出来结果为10000,同时当我们在执行第一条sql时,有一条更新语句把id=2的这一行记录改为了50000;我们再执行第二条语句的时候查询结果就是50000,和我们的预期就不符合了,此时可能会导致程序的一些问题,或者业务上的一些问题。

如上距离的这两种情况就应该要开启事务,如下:

begin;

select * from account where id=1;

select * from account where id=2;

commit;

此时当id=2的值被更改后,读取到的值仍然是旧的值,即这两条sql读取的是同一时刻的值。

开启事务后,不管有多少条查询语句,他们查询的数据内容都是和第一条查询语句处于同一时间的内容,如第一条查询语句在10:00:01执行,则后面所有的查询语句,查询的数据都是10:00:01这一刻的数据,即在10:00:01这一刻的快照。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值