MySQL中的某些语句(最著名的是DDL)会在执行 之前 导致隐式提交 , 并且无法回滚-这样可以防止先前的DML更改也被回滚。
本节中列出的语句(及其任何同义词) 隐式结束当前会话中任何活动的事务,就好像您在执行该语句之前执行了COMMIT一样 。从MySQL
5.5.3开始,大多数这些语句在执行后也会引起隐式提交;有关更多详细信息,请参见本节末尾。
由于
ALTER TABLE是受影响的语句之一,因此将SQL批处理有效地视为:
START TRANSACTION;INSERT INTO `users` VALUES(NULL, 'User A', 'user.a@example.com', '4', 'User A');COMMIT; -- prevents ROLLBACK of insert(s), even if DDL failsALTER TABLE `users` CHANGE `level` `level` TINYINT(3) UNSIGNED NOT NULL;
建议的解决方案是使DDL和DML分开。该文档说:
您应设计[DML]事务,使其不包含此类[DDL]语句。如果您在无法回滚的事务中提早发出了一个语句,然后又有另一个语句失败,则在这种情况下,通过发出ROLLBACK语句将无法回滚事务的全部效果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)