MySQL--当事务遇到DDL命令

众所周知MySQL的DDL语句是非事务的,即不能对DLL语句进行回滚操作,哪在事务中包含DDL语句会怎样呢?

如:

#禁用自动提交
set autocommit=off;
#创建tb1
create table tb1(id int auto_increment primary key,c1 int);
#开始事务
start transaction;
#插入数据
insert into tb1(c1) select 1;
insert into tb1(c1) select 2;
insert into tb1(c1) select 3;
#创建tb2
create table tb2(id int auto_increment primary key,c1 int);

这时候如果执行rollback,会发现插入到tb1中数据没有被回滚:

如果查看binlog:

在创建tb2之前,有一个commit操作将上面语句中的事务进行提交,因此虽然后面执行了rollback操作,但实际上rollback的是另外一个空事务,所以没有任何数据发生“回滚”。

=============================================================================

在执行研发同事提交的脚本时,应当将DDL和DML语句以及DCL语句严格分开,避免事务被隐性“破坏”,导致误操作情况发生。

比如你打开一个事务正在修改数据,恰好研发同事找你在这个库上新建一个表,剪完你发现自己数据改错了,此时再想回滚就悲剧啦!

又比如研发给你一个事务脚本,中间夹渣一个DDL语句,导致事务“中途”提交一次,等最后发现异常要回滚却发现只能回滚一部分。

=============================================================================

总结:

当执行到DDL语句时,会隐式的将当前回话的事务进行一次“COMMIT”操作,因此在MySQL中执行DDL语句时,应该严格地将DDL和DML完全分开,不能混合在一起执行。

=============================================================================

原文地址:https://www.cnblogs.com/leochenliang/p/9716304.html

时间: 2024-11-13 06:35:45

MySQL--当事务遇到DDL命令的相关文章

Mysql常用DDL命令

Mysql常用命令:--在Mysql中,语句的结尾要么使用;要么使用\g或者\G作为结束符.进入Mysql (---其中Your MySQL connection id is 5表示到当前为止连接到Mysql数据库的次数,Server version: 5.5.37-log Source distribution表示Mysql数据库的版本)[[email protected] data]$ mysql -uroot -pEnter password:Welcome to the MySQL mo

MySQL的事务

MySQL的事务 1.事务:事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这一系列操作要么全部执行,要么全部放弃执行. 2.事务具备的四个特性(简称为ACID性): (1)原子性(Atomicity): 事务是应用中最小的执行单位,具有不可再分的特征,事务是应用中最小的逻辑执行体: (2)一致性(Consistency): 事务执行的结果必须使数据库从一个一致性状态转变到另一个一致性的状态.当数据库只包含事务成功提交的结果时,数据库处于一致性状态.如果系统运行发生中断,某个事务尚未完成而

MySql的事务操作与示例

事务就是一个逻辑工作单元的一系列步骤.事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durability(可靠性) [事务只针对对数据数据产生影响的语句有效] show engines  //查看mysql锁支持的数据引擎 MyISAM不支持事物,InnoDB支持事物 默认情况下,MySQL将以自动提交模式运行,这意味着没一条小命令都将当做一个只有一条命令的事物来执行. 如果要让mysql支持支

MySql的事务操作与演示样例

事务就是一个逻辑工作单元的一系列步骤. 事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durability(可靠性) [事务仅仅针对对数据数据产生影响的语句有效] show engines  //查看mysql锁支持的数据引擎 MyISAM不支持事物.InnoDB支持事物 默认情况下,MySQL将以自己主动提交模式执行,这意味着没一条小命令都将当做一个仅仅有一条命令的事物来执行. 假设要让mys

mysql之事务

我们先来说说什么是事务: 事务就是逻辑上的一组操作,组成这组操作的各个单元,要不全都成功,要不全都失败.一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行.换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的.如果在事务的任何操作失败,则整个事务将失败. mysql的事务支持不是绑定在mysql服务器本身,而是与存储引擎相关.例如,MyISAM:不支持事务,用于只读程序提高性能:InnoDB:支持ACID事务,行级所,并发:Berkeley DB:支持事务. 事务的

MySQL数据库事务隔离级别(Transaction Isolation Level)

今天在学习JDBC的时候看到了关于MySql的事务的隔离级别的问题,感觉内容挺高级的,所以记录一篇文章,以备后面使用. 数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = R

[转]MySQL 数据库事务隔离级别

然后说说修改事务隔离级别的方法: 1. 全局修改,修改 mysql.ini 配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ 这里全局默认是 REPEATABLE-READ, 其实 MySQL 本来默认也是这个级别2. 对当前 session 修改,在登录 mysql 客户

MySQL数据库事务隔离级别

数据库隔离级别有四种,应用<高性能mysql>一书中的说明: 然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. 2 [mysqld] 3 transaction-isolation = REPEATABLE-READ 这里全局默认是REPEATABLE-READ,其实MySQL本来默认也是这个级别 2.对当

mysql的事务控制

要显式地开启一个事务须使用命令BEGIN或START TRANSACTION,或者执行命令SET AUTOCOMMIT=0,以禁用当前会话的自动提交. 事务控制语句: 命令 含义 开启事务 BEGIN ① 不能用于存储过程 显示地开启事务 BEGIN  WORK START  TRANSACTION 提交事务 COMMIT 提交事务,并使已对数据库进行的所有修改称为永久性,COMMIT与COMMIT WORK几乎是等价的. COMMIT  WORK② 回滚事务 ROLLBACK 回滚用户的事务,