和BEGIN等效的命令还有“BEGIN WORK”及“START TRANSACTION”。 执行BEGIN命令并不会真的去引擎层开启一个事务,仅仅是为当前线程设定标记,表示为显式开启的事务。 当以BEGIN开启一个事务时,首先会去检查是否有活跃的事务还未提交,如果没有提交,则调用ha_commit_trans提交之前的事务,并释放之前事务持有的MDL锁。 执行 执行这个语句会立即开启事务时还会顺便创建一致性视图(Read View) 关闭自动提交,则执行 查询 select 语句或者修改语句,Innodb 都会开启事务 在MySQL中,可以通过 步骤1:在窗口1开启会话,查询当前执行中的事务,看到当前并无执行中的事务 同理,用上诉方法,可以证明1. BEGIN
BEGIN 语句后,直到执行 查询 select 语句或者修改语句,Innodb 才会开启事务,并创建一致性视图(Read View)2. START TRANSACTION WITH CONSISTENT SNAPSHOT
3. AUTOCOMMIT=0
4. 实验
SHOW ENGINE INNODB STATUS 命令,或者查询表 NFORMATION_SCHEMA.INNODB_TRX 查看事务状态,本文用的是查询NFORMATION_SCHEMA.INNODB_TRX 判断哪种命令开启了事务。4.1 验证
BEGIN 语句

步骤2:在窗口2开启会话,只执行 BEGIN 语句,并返回窗口 1 查询当前执行中的事务

仍然看到当前并无执行中的事务,可以得出结果 只执行BEGIN 语句并不会立即开启事务

步骤3:执行查询语句 select * from account ; ,并返回窗口 1 查询当前执行中的事务

此时可以看到,有正在执行中的事务,可以得出结果,在执行BEGIN语句后,直到执行 查询 select 语句或者修改语句,Innodb 才会开启事务

START TRANSACTION WITH CONSISTENT SNAPSHOT语句执行后,会立即开启事务参考链接