跟老姚学前端,课程体系更完善,10%基础 + 90%实战演练,快人一步学编程

扫一扫浏览

关于mysql事务处理可能不成功的原因分析

未结贴
1 5165
yaosean站长未认证 2019-01-06 08:59:38
收藏

事务是保证数据一致性的保障,很多时候我们都须要用到事务来处理一些复杂的逻辑,没有事务的情况数据就会出现差错,但有时候你的事情就不会成功,却不知道原因,接下来我把一些问题进行简单的分析

数据库引擎

首先你的数据库要支持事务处理,如果这都不能保证,事务也就不存在了,因此在创建表的时候就要指定数据库引擎,例如:

CREATE TABLE `tpf_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

其中InnoDB就是支持事务的数据库引擎,事多相关知道可以看这篇“mysql数据库引擎

事务处理流程

事务的通常的处理流程是这样的

1、开启事务
2、逻辑处理(数据库相关处理)
3、提交事务
4、回滚事务

直接代码的时候是要加上try{}catch{}处理的,例如:

Db::startTrans();	// 开启事务
try{
    Db::execute("INSERT INTO `".DB_PREFIX."test` (`username`) VALUES ('aaa');");
    Db::execute("INSERT INTO `".DB_PREFIX."test` (`username`) VALUES ('bbb');");

    Db::commit(); // 放后面统一提交
}catch(\Exception $e){

    Db::rollback();	// 出现异常后回滚

    throw new \Exception($e->getMessage(), 1);
}

像这种如果出现数据处理问题,就会回滚,但是如果像下面这样的呢

Db::startTrans();
try{
    Db::execute("DROP TABLE `".DB_PREFIX."test`;");
    Db::execute("INSERT INTO `".DB_PREFIX."test` (`username`) VALUES ('aaa');");
    Db::execute("INSERT INTO `".DB_PREFIX."test` (`username`) VALUES ('$bbb');");
    Db::commit();

}catch(\Exception $e){
    Db::rollback();
    throw new \Exception($e->getMessage(), 1);
}

注意看里面有一个$bbb变量是存在的,肯定会出错,但我前面是删除表,后面再插入,数据会不会回滚呢,遗憾的是报的不是变量$bbb未定义,而是表test不存在,说明删除已经成功了,什么原因呢???

原因就是DROP在进行处理的时候是即时提交的,也就是直接commit,只要commit成功后的操作都是不能再回滚的了,事务将失效,那么哪些会有这种情况呢???

实际上DDL(Data Definition Language 数据定义语言)的所有操作都是即时提交的,例如像下面的这么一些命令

create table 创建表     
alter table  修改表   
drop table 删除表   
truncate table 删除表中所有行     
create index 创建索引   
drop index  删除索引

总的来说,只要是提交后,进行的事务回滚都将失效

总结

我们进行事务处理通过都只是针对DML(data manipulation language)数据操纵语言进行处理,也就是我们常用的UPDATE、INSERT、DELETE,因为以后再用事务的时候不成功就要好好分析原因了

文章来源tpframe,转载请指明出处!

最近热帖 HOT TOPIC
【全套视频】thinkphp5视频教程 87211
父元素flex之后,子元素高度自适应问题 10980
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 10056
thinkphp5隐藏默认模块的一些问题 9528
api接口文档插件easydoc的基本用法,快速搞定接口文档 9481
omnicore rpc api中文手册【usdt】 9308
PHP如何判断字符串是否为json格式 9222
教你如果处理高并发数据不同步的问题php篇 9066
关于thinkphp5.0.x getshell漏洞的说明 8883
使用宝塔linux面板创建FTP无法连接的解决办法(阿里云或腾讯云) 8765
月度热议HOT COMMENTS
【全套视频】thinkphp5视频教程 71
tpframe 后续版本你希望有的功能是什么(分享贴) 12
权限那里怎么一登录别的账号就报错啊 9
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
tpframe6.0马上就要跟大家见面了,一次全新的升级 5
透析thinkphp5升级版开发框架tpframe 3
新增的管理员没有权限操作CMS模块。 3
爆料早知道: