Innodb的事务处理autocommit参数问题
来源:互联网 发布:加盟农村淘宝要多少钱 编辑:程序博客网 时间:2024/06/07 23:41
在一个开源项目中看到Mysql类事务处理的逻辑:
//开启事务function strans(){ mysql_query("start transaction");//开始一个事务 mysql_query("SET AUTOCOMMIT=0"); //设置事务不自动commit} //提交事务function commit(){ mysql_query("commit"); mysql_query("SET AUTOCOMMIT=1");}//回滚事务function rollback(){ mysql_query("rollback"); mysql_query("SET AUTOCOMMIT=1");}类中频繁地对autocommit进行了设置,可见其对autocommit的实际意义并没有理解。
在Innodb引擎中,事务是自动开启的,这就存在一个问题:事务需要提交才能被执行。但是实际应用中可能很多情况只有一条sql,如果也要手动提交才能被执行的话就太麻烦了,所以Innodb引擎默认缺省的autocommit=on(show variables like '%autocommit%'),即自动提交。
但是每一条sql都自动提交(每一条sql都是一个独立事务)的话,就无法构建多张表的事务管理了。所以有必要将N条sql组成一个事务进行提交。主要有以下两种方法:
1:通过设置autocommit:即手动设置在一段代码区间内,不自动提交,区间内的所有sql,组成一个事务手动提交;执行完毕,再还原为自动提交。
$db->query('set autocommit=0');$db->query('');$db->query('');if($db->query('commit')){ //事务执行成功}else{ $db->query('rollback');}$db->query('set autocommit=1'); //必须恢复autocommit=1,否则后面所有sql无法执行$db->query(''); //恢复autocommit=1后,该语句方可成功执行
2:显示打开一个事务,该方法中,start transaction到commit(rollback)之间的sql,将会组成一个事务。
$db->query('start transaction');$db->query('');$db->query('');if($db->query('commit')){ //事务执行成功}else{ $db->query('rollback');}$db->query(''); //该条数据可以插入
需要说明的是,开启事务之后,在commit(rollback)之前的sql,如果有select,且select的是当前事务会更新的行(表),那么提取出来的将是事务提交后的预定值,而不是数据库中存储的当前值。如下:
start transactionupdate tableA set columnA=B //原columnA=Cselect columnA from tableA //结果为B,而不是C(尽管事务未被提交)commit
1 0
- Innodb的事务处理autocommit参数问题
- Hibernate的autocommit问题
- Innodb表类型中autocommit的设置
- 关于数据库写入慢的问题autocommit,索引等对Innodb写入速度的影响
- mysql autocommit对myisam,innodb的性能影响
- 事务处理 set autocommit = 0
- mysql禁用autocommit,以及遇到的问题
- mysql禁用autocommit,以及遇到的问题
- mysql禁用autocommit,以及遇到的问题
- InnoDB和MyISAM的差别(mysql事务处理)
- 1、Python MySQLdb默认关闭autocommit带来的坑 2、mysql事务处理
- PB中 autocommit 和 commitondisconnect 两个连接参数的应用
- autocommit对myisam和innodb引擎的影响,myisam不支持事务,默认引擎
- Connection中的autocommit问题
- AUTOCOMMIT自动提交该参数要大写才能生效,否则即使小写autocommit改为off,但小写的autocommit并不生效
- 事务处理的层次问题
- 分布式事务处理的问题
- 事务处理的层次问题
- java中反射机制和Class.forName、实例对象.class(属性)、实例对象getClass()的区别
- 冬至,祝福暖 爱至,心温暖
- Service笔记1
- implements Serializable有什么作用?
- oracle 安装出现文件找不到的错误
- Innodb的事务处理autocommit参数问题
- java通过DOM操作xml
- 就用这句话激励自己吧
- swift --2
- 使用 tcpdump监听某一端口数据
- MySql错误处理- 错误代码和消息
- Java IO系列0 InputStream与OutputStream(字节流)
- Android学习(3)---Fragment的学习
- C#开启SQLSERVER数据库缓存依赖优化网站性能