前些天在Q群里有为群友问有两个对mysql数据库的操作,一个是对某张表的数据进行删除,另一个是对另一张表的删除,两个操作加入到同一事务中,如果数据删除这步出错,事务是否会回滚?即对于表的删除会不会失效?

对于表的删除操作(DDL),事务不会回滚。

 查了下资料,现有如下总结:

     DDL:数据库定义语言,如DROP、ALTER、CREATE等等。

     DML:数据库操纵语言,SQL中处理数据等操作统称为数据操纵语言。如SELECT、SAVE、DELETE、 UPDATE等。

     DCL:数据控制语言,用来授予或回收访问数据库的某种特权,并控制 数据库操纵事务发生的时间及效果,对数据库实行监视等。如GRANT,COMMIT,ROLLBACK等。

     因为不同的操作隐含着不同的数据提交方式,下面说一下提交数据的方式:

     ①显式提交:用 COMMIT命令直接完成的提交为显式提交。

     ②隐式提交:  用 SQL命令间接完成的提交为隐式提交。以下命令都是隐性提交的:ALTER , AUDIT, COMMENT, CONNECT, CREATE, DISCONNECT, DROP, EXIT, GRANT,NOAUDIT, QUIT, REVOKE, RENAME。

③自动提交:若把 AUTOCOMMIT 设置为 ON ,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。

     所有的 DML 语句都是要显式提交的,即要在执行完DML语句之后,执行 COMMIT 。而其他的诸如 DDL 语句的,都是隐式提交的。也就是说,在运行那些非 DML 语句后,数据库已经进行了隐式提交,例如 CREATE TABLE,在运行脚本后,表已经建好了,并不在需要你再进行显式提交。所以非DML操作是不能回滚的。

     DML 语句,执行完之后,要处理的数据都会放在回滚段中(除了 SELECT 语句),等待用户进行提交(COMMIT)或者回滚 (ROLLBACK),当用户执行 COMMIT / ROLLBACK后,放在回滚段中的数据就会被删除。OMMIT / ROLLBACK 都是用在执行 DML语句之后的。这也就是为什么DML语句可以回滚的原因了。而SELECT 语句执行后,数据都存在共享池。提供给其他人查询相同的数据时,直接在共享池中提取,不用再去数据库中提取,提高了数据查询的速度。