84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
MyISAM不支持事务,但如果遇到数据库错误,怎么实现回滚?例如:一段程序要先插入a表,然后再插入b表。 逻辑如下行不行:
aResut=doInsertA if(aResut){ bResult=doInsertB if (!bResult){ delete aResult from a } }
欢迎选择我的课程,让我们一起见证您的进步~~
如果非需要用myisam,可以这样用 先插入临时表中,如果执行成功用insert tableA from select id name from tableb.这样模拟事物。可以封装为存储过程
insert tableA from select id name from tableb
改成innodb
binlog
你好,你说的没错MyISAM不支持回滚。但是有几种提前预防数据丢失的措施:如下
MyISAM
要么存储引擎改成InnoDB;
InnoDB
要么把每次执行的SQL语句保存起来;
SQL
要么常备份
楼上说了binlog我也很好奇是什么鬼,我上面的回答狭隘了。于是找到了这个东西: mysqlbinlog+MyISAM实现mysql随时随地恢复的方法
myisam不支持事务,改为innodb吧还有binlog是可以恢复数据的,但是不能实时恢复
表用innodb吧。然后定义一个异常,如,表不存在begindeclare flag varchar(32);-- 定义异常declare exit handler for 1146begin
rollback ; ...
endset autocommit = 0 ; -- 开启事务aResut=doInsertA
if(aResut){ bResult=doInsertB
if (!bResult){ -- 触发异常回滚 insert into abcdefghijklmn(a)values('a'); }
}-- 提交commit ;
没有办法,myisam是不支持事务的,换成innodb吧
如果非需要用myisam,可以这样用 先插入临时表中,如果执行成功用
insert tableA from select id name from tableb
.这样模拟事物。可以封装为存储过程改成innodb
binlog
你好,你说的没错
MyISAM
不支持回滚。但是有几种提前预防数据丢失的措施:如下要么存储引擎改成
InnoDB
;要么把每次执行的
SQL
语句保存起来;要么常备份
楼上说了
binlog
我也很好奇是什么鬼,我上面的回答狭隘了。于是找到了这个东西: mysqlbinlog+MyISAM实现mysql随时随地恢复的方法myisam不支持事务,改为innodb吧
还有binlog是可以恢复数据的,但是不能实时恢复
表用innodb吧。
然后定义一个异常,如,表不存在
begin
declare flag varchar(32);
-- 定义异常
declare exit handler for 1146
begin
end
set autocommit = 0 ; -- 开启事务
aResut=doInsertA
if(aResut){
bResult=doInsertB
}
-- 提交
commit ;
没有办法,myisam是不支持事务的,换成innodb吧