一次MySql事务执行回滚失败分析
2016-03-18 01:57
363 查看
前几天在添加一个上限控制功能时,发现在一次取资源超过限制之后,事务回滚,但该次操作造成的数据库更改并未回滚
按以下步骤进行分析:
1. 仔细检查代码逻辑,看是否由于事务回滚没有调用造成的脏数据
2. gdb单步调试程序,定位脏数据产生的时间点,回滚是否成功
3. 根据已有资料分析问题产生原因。
经过以上步骤分析,在单步时已经确认是由于事务中调用了create table造成的隐式提交,从而回滚时,无法按照预想回滚
知识点补充:
1.MySQL最常用的两个表类型: InnoDB和MyISAM。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持、存储过程、视图、行级锁定等等高级数据库功能,若回滚失败,先检查表类型。
2.有的时候有些SQL语句会产生一个隐式的提交操作,即执行完成这些语句后,会有一个隐式的COMMIT操作。有以下SQL语句,不用你去“管”:
DDL语句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;
修改MYSQL架构的语句,CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;
管理语句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等
设计事务时,不应包含这类语句。如果在事务的前部中发布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
参考资料:
1. 说说MySQL中的事务
2. MySQL入门到精通(偏性能调优方向)
3. MySQL 5.1参考手册
4. InnoDB 中文参考手册
按以下步骤进行分析:
1. 仔细检查代码逻辑,看是否由于事务回滚没有调用造成的脏数据
2. gdb单步调试程序,定位脏数据产生的时间点,回滚是否成功
3. 根据已有资料分析问题产生原因。
经过以上步骤分析,在单步时已经确认是由于事务中调用了create table造成的隐式提交,从而回滚时,无法按照预想回滚
知识点补充:
1.MySQL最常用的两个表类型: InnoDB和MyISAM。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持、存储过程、视图、行级锁定等等高级数据库功能,若回滚失败,先检查表类型。
2.有的时候有些SQL语句会产生一个隐式的提交操作,即执行完成这些语句后,会有一个隐式的COMMIT操作。有以下SQL语句,不用你去“管”:
DDL语句,ALTER DATABASE、ALTER EVENT、ALTER PROCEDURE、ALTER TABLE、ALTER VIEW、CREATE TABLE、DROP TABLE、RENAME TABLE、TRUNCATE TABLE等;
修改MYSQL架构的语句,CREATE USER、DROP USER、GRANT、RENAME USER、REVOKE、SET PASSWORD;
管理语句,ANALYZE TABLE、CACHE INDEX、CHECK TABLE、LOAD INDEX INTO CACHE、OPTIMIZE TABLE、REPAIR TABLE等
设计事务时,不应包含这类语句。如果在事务的前部中发布了一个不能被回滚的语句,则后部的其它语句会发生错误,在这些情况下,通过发布ROLLBACK语句不能 回滚事务的全部效果。
参考资料:
1. 说说MySQL中的事务
2. MySQL入门到精通(偏性能调优方向)
3. MySQL 5.1参考手册
4. InnoDB 中文参考手册
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜
- MySQL 备份与恢复