在 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 UPDATE
或LOCK IN SHARE MODE
)需要 显式开启事务,并会持有行锁,直到事务提交或回滚。
5. 总结
InnoDB 的所有操作,包括查询,都会在事务上下文中执行。
普通查询(SELECT )也会启动一个事务,但通常是隐式事务,查询结束后自动提交。
如果使用
SELECT ... FOR UPDATE
,则会持有行锁,需要手动提交事务。
示例
-- 普通查询,隐式事务,查询完成后自动提交
SELECT * FROM users;
-- 显式开启事务,查询不会自动提交
START TRANSACTION;
SELECT * FROM users;
COMMIT;
结论:SELECT *
会使用事务,但通常是隐式事务,并且不会持有锁,查询结束后立即提交。