扫一扫浏览

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

未结贴
1 2915
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
父元素flex之后,子元素高度自适应问题 5077
thinkphp5隐藏默认模块的一些问题 4740
一张纸的厚度是0.01毫米,则该纸对折30次后是多厚(据说超过珠穆朗玛峰的高度)php实现 4386
关于thinkphp5.0.x getshell漏洞的说明 4101
tpframe新建主题 4070
教你如果处理高并发数据不同步的问题php篇 4057
移动web资源整理,你值得收藏的干货 3926
【全套视频】thinkphp5视频教程 3905
omnicore rpc api中文手册【usdt】 3877
2018最新版PHP视频教程-ThinkPHP5商城系统+项目实战 3789
月度热议HOT COMMENTS
tpframe 后续版本你希望有的功能是什么(分享贴) 12
权限那里怎么一登录别的账号就报错啊 9
关于tpframe的一点话题 6
cms插件在分类排序的时候JSON错误 6
基于tpframe v3.x 的微信公众号插件已批量上线 5
tpframe插件tcms插件v2.2已发布上线,欢迎下载使用 5
tpframe6.0马上就要跟大家见面了,一次全新的升级 5
新增的管理员没有权限操作CMS模块。 3
api接口文档插件easydoc的基本用法,快速搞定接口文档 3
thinkphp5自动完成操作,两次运行的详解 2