侧边栏壁纸
博主头像
月伴飞鱼 博主等级

行动起来,活在当下

  • 累计撰写 126 篇文章
  • 累计创建 31 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

MySQL的Select *会用到事务吗?

月伴飞鱼
2025-03-18 / 0 评论 / 1 点赞 / 10 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

InnoDB 存储引擎 中,所有操作 都是在事务的上下文中执行的,包括 查询(SELECT)修改(INSERT、UPDATE、DELETE)

1. SELECT * 是否使用事务?

是的,即使是 SELECT * 这样的 普通查询,也会在事务的上下文中执行,即使没有明确开启事务,InnoDB 也会自动开启一个隐式事务

2. 为什么查询也在事务中?

  • InnoDB 的事务机制保证了数据的一致性隔离性,因此即便是查询,也会在事务的上下文中执行

  • 但由于 查询本身不会修改数据,因此 不会持有事务锁,通常查询完成后事务会立即提交

3. 隐式事务(Implicit Transaction)

  • 如果未显式开启事务(即未使用 BEGIN / START TRANSACTION),那么 InnoDB 会为每个 SQL 语句单独创建一个 隐式事务,并在查询结束后自动提交

  • 这种事务模式称为 自动提交事务(autocommit),即 每条 SQL 语句都是一个独立的事务

4. 事务对 SELECT 语句的影响

  • 普通 SELECT *(非锁定查询)

    • 不会持有锁,事务提交后立即释放。

    • 只受 快照读(MVCC) 影响,不会影响其他事务的操作。

  • 加锁查询(如 SELECT ... FOR UPDATELOCK IN SHARE MODE

    • 需要 显式开启事务,并会持有行锁,直到事务提交或回滚。

5. 总结

  • InnoDB 的所有操作,包括查询,都会在事务上下文中执行。

  • 普通查询(SELECT )也会启动一个事务,但通常是隐式事务,查询结束后自动提交。

  • 如果使用 SELECT ... FOR UPDATE,则会持有行锁,需要手动提交事务

示例

-- 普通查询,隐式事务,查询完成后自动提交
SELECT * FROM users;

-- 显式开启事务,查询不会自动提交
START TRANSACTION;
SELECT * FROM users;
COMMIT;

结论SELECT * 会使用事务,但通常是隐式事务,并且不会持有锁,查询结束后立即提交。

公众号.png

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
    1. 支付宝打赏

      qrcode alipay
    2. 微信打赏

      qrcode weixin
博主关闭了所有页面的评论