MySQL疑问:执行SET SESSION TRANSACTION后是否需提交事务?
关于临时表创建与事务隔离级别、COMMIT的疑问解答
嘿,我来帮你把这个问题理清楚~
首先,先明确几个关键知识点,再回答你的核心疑问:
1. MySQL临时表的事务特性
MySQL的临时表是会话级私有的,默认情况下(autocommit=1),CREATE TEMPORARY TABLE ... AS SELECT这个语句本身是一个自动提交的单语句事务——也就是说,执行完这条语句后,MySQL会自动完成提交,不需要你手动加COMMIT。
2. 隔离级别设置的作用
你执行的SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;是会话级别的设置,它会影响当前会话中后续所有的事务(包括单语句自动提交的事务),直到你修改隔离级别或者会话结束。
之前出现死锁,大概率是因为默认的REPEATABLE READ隔离级别下,SELECT * FROM mytable会持有更久、范围更广的共享锁,和其他会话的写操作容易产生锁冲突;而READ COMMITTED隔离级别下,读操作的锁粒度更松(甚至很多场景下是快照读,不加锁),所以避免了死锁的发生。
3. 到底要不要加COMMIT?
分两种情况看:
- 默认
autocommit=1场景:完全不需要加COMMIT。因为CREATE TEMPORARY TABLE ... AS SELECT是单语句,MySQL会自动提交,手动加COMMIT不会有问题,但属于多余操作。 autocommit=0场景:如果你手动关闭了自动提交,那确实需要加COMMIT来结束当前事务,否则事务会一直处于打开状态,反而可能导致锁持有时间过长,增加死锁风险。不过一般生产环境默认都是autocommit=1,所以这种情况很少见。
简单说:你目前的写法(只设隔离级别+创建临时表)是完全没问题的,不需要额外加COMMIT。
内容的提问来源于stack exchange,提问作者Werner
相关产品推荐
相关产品推荐

