赞
踩
今天同事在使用Navicat Premium 操作MySql时,想执行某条件的SELECT语句查询是否有数据,没注意粘贴的是 DELETE 语句,点击执行后意识到问题 ,立即执行rollback,再查询发现数据还是被删掉了。然后就想将Navicat Premium 自动提交给取消,防止之后再发生此类情况。
查询了下 Navicat Premium 软件本身没找到可设置取消自动提交的选项,从MySql 的角度看有没有解决方式。先说结论:
将执行DML语句时,在SQL语句前设置 set autocommit = 0; 即取消MySql 的自动提交,举例:
set autocommit = 0;
delete from table1 where id =xxx;
commit; or rollback;
该方式可使Navicat Premium 不自动提交SQL语句,生效需要手动commit 或者 rollback
需要注意的是:该方式的生效范围为session 级别,即重新登录,或者打开新的查询页面,都需要单独设置该参数,否则使用的还是MySql 的默认设置。
MySql 的默认设置,可通过以下语句查看。
show variables like 'autocommit'
下面为当时的实验步骤:
(1)查看MySql默认commit 设置,ON为自动提交
(2) 创建测试表并插入基础数据
create table testrollback(
id int,
info varchar(200)
);
insert into testrollback values (1,'info1');
insert into testrollback values (2,'info2');
insert into testrollback values (3,'info3');
insert into testrollback values (4,'info4');
(3) 同时执行以下查询-删除数据-查询结果-执行rollback-查询结果 语句
select * from testrollback ;
delete from testrollback where id =4;
select * from testrollback ;
rollback;
select * from testrollback ;
3次查询结果分别如下:
第一次:
第二次:
第三次:
可以发现,删除后执行的rollback 并未生效,id=4 的数据还是被删掉了。
(4) 设置 autocommit - 删除数据-查询结果-执行rollback-查询结果 语句
同时执行如下语句:
set autocommit = 0;
delete from testrollback where id =3;
select * from testrollback ;
rollback;
select * from testrollback ;
2次查询结果分别如下:
第一次:
第二次:
这时发现, delete 后 的rollback语句生效了,达到了想要的效果。
这时查看
show variables like 'autocommit'
属性已设置为 OFF
重新打开查询界面或重新登录后,该属性依旧为 ON ,即该设置为 session 级别,重新登录,或者打开新的 查询页面,都需要单独设置。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。