Geotto 2021-08-19 11:19 采纳率: 100%
浏览 58
已结题

关于MySQL中SELECT语句的原子性问题

在MySQL数据库中存在一张settings表:

snamesvalue
no0
no20

同时存在以下两个函数:

CREATE FUNCTION `fn_inc_no`() RETURNS int(11)
BEGIN
    DECLARE val INT DEFAULT 0;
    
    UPDATE settings
    SET svalue = svalue + 1
    WHERE sname = 'no';
    
    SELECT svalue INTO val FROM settings WHERE sname = 'no';
    
    RETURN val;
END

CREATE FUNCTION `fn_inc_no2`() RETURNS int(11)
BEGIN
    DECLARE val INT DEFAULT 0;
    
    UPDATE settings
    SET svalue = svalue + 1
    WHERE sname = 'no2';
    
    SELECT svalue INTO val FROM settings WHERE sname = 'no2';
    
    RETURN val;
END

如果此时在Java程序中运行如下代码:

Statement query = conn.createStatement();
ResultSet rs = query.executeQuery("SELECT fn_inc_no() AS no, fn_inc_no2() AS no2");

在多个线程(测试时使用了10个线程)中多次(测试时重复执行10000次)执行以上代码,最后得到的 no 和 no2 总是相等的。这是否说明了这条SELECT语句当中的fn_inc_no和fn_inc_no2总是在同一个事务中执行的,是否说明此条SELECT语句在MySQL中本身是一个原子操作?

  • 写回答

4条回答 默认 最新

  • stacksoverflow 2021-08-19 12:44
    关注

    不同的函数操作的两个不同行,说明不了任何问题。
    前条语句更新,后条语句查询,肯定返回的是更新后的结果。

    也不用多个线程循环,你让两个函数操作同一行记录, 第一赋值为3,第二个不赋值,直接查询,看看能不能查询出3即可。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月27日
  • 已采纳回答 8月19日
  • 修改了问题 8月19日
  • 修改了问题 8月19日
  • 展开全部

悬赏问题

  • ¥15 宇视监控服务器无法登录
  • ¥15 PADS Logic 原理图
  • ¥15 PADS Logic 图标
  • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
  • ¥15 DruidDataSource一直closing
  • ¥20 气象站点数据求取中~
  • ¥15 如何获取APP内弹出的网址链接
  • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
  • ¥50 STM32单片机传感器读取错误
  • ¥50 power BI 从Mysql服务器导入数据,但连接进去后显示表无数据