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

关于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 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。