• 查询方法需要使用事务吗


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

    查询方法需要使用事务吗?这得看数据库的事务隔离级别,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代表账户余额。

    1. create table account(id int,name varchar(20), balance float);
    2. insert into account(1,'小明',10000);
    3. insert into account(2,'小红',30000);
    4. 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这一刻的快照。

  • 相关阅读:
    7个自定义定时任务并发送消息至邮箱或企业微信案例(crontab和at)
    【机器学习周志华】读书笔记 P1 机器学习基本概念知识
    完全背包问题
    【HDU No. 1224】 免费DIY之旅
    mysql进程信息出现大量Waiting for table level lock信息的原因,怎么处理?
    HarmonyOS 音频开发指导:使用 OpenSL ES 开发音频播放功能
    pyrouge安装(Linux)新手
    C#访问修饰符、修饰符
    存储器(二):DRAM
    React18入门(第三篇)——React Hooks详解,React内置Hooks、自定义Hooks使用
  • 原文地址:https://blog.csdn.net/weixin_38972910/article/details/126273275