php关于mysql数据库简单回滚问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php关于mysql数据库简单回滚问题相关的知识,希望对你有一定的参考价值。
现在,数据库中有zhangsan和lisi两个user,均有钱20,现在想要实现zhangsan向lisi转账20,用一下php代码实现,但是数据库没有实现回滚,求大神指点:
<?php
//创建数据库连接对象
$mysqli=new mysqli('localhost','root','root','users');
//将mysql数据库的自动提交设置false
$mysqli->autocommit(false);
//设置sql指令
$sql1="update account set account=account-2 where name='zhangsan'";
$sql2="update account set account=accountt+2 where name='lisi'";
//执行指令
$r1=$mysqli->query($sql1);
$r2=$mysqli->query($sql2);
//判断结果
if(!$r1||!$r2)
//两个sql语句执行中至少有一个错误,回滚处理
$mysqli->rollback();
else
$mysqli->commit();
$mysqli->close();
?>
仔细阅读过官方手册的同学,一定留意到了对于提升大事务回滚效率,官方提供了两种方法:一是增加 innodb_buffer_pool_size 参数大小,二是合理利用 innodb_force_recovery=3 参数,跳过事务回滚过程。第一种方式比较温和,innodb_buffer_pool_size 参数是可以动态调整的,可行性也较高。第二种方式相较之下较暴力,但效果较好。
两种方式各有自己的优点,第一种方式对线上业务系统影响较小,不会中断在线业务。第二种方式效果更显著,会短暂影响业务连续,回滚所有没有提交的事务。 参考技术A 我想问下你这个表的引擎(engine)是innodb还是myisam ?myisam 是不支持回滚机制的。。
如果你表的确是myisam类型那你可以打印下$r1和$r2的结果然后进行调试,看问题出在哪?是语法错误呢?还是mysqli没有开启扩展还是别的什么错误。。追问
喂,哥,你确认你说的没有矛盾吗
本回答被提问者采纳 参考技术B 您需要检测$r1和$r2是否返回值为真。[PHP]关于连接MySQL的问题
概述
PHP中无论使用MySQL函数抑或PDO连接MySQL服务器,都允许有两种方式,一是通过TCP网络层,一是通过unix socket;
PHP并没有给出指明用何种方式去连接数据库,决定使用何种方式去连接数据库的是,连接时host的指定:
1、当host为一个ip值时,PHP使用TCP网络层方式去连接数据库;
2、当host的值为localhost时,PHP使用unix socket的方式连接数据库;
问题
当使用unix socket的方式连接数据库时,你必须确保本地的MySQL服务启用了unix socket这个连接方式;
一般来说MySQL服务会在/var/lib/mysql目录下建立一个mysql.sock,以确保PHP通过打开此文件连接MySQL服务;
并且php.ini在以下配置项,必须明确指明该文件的位置:
mysql.default_socket = /tmp/mysql.sock pdo_mysql.default_socket= /tmp/mysql.sock mysqli.default_socket =/tmp/mysql.sock //使用mysqld引擎的数据库应修改为如下设置 mysql.default_socket = /tmp/mysqld.sock pdo_mysql.default_socket= /tmp/mysqld.sock mysqli.default_socket =/tmp/mysqld.sock
假如没有正确配置php.ini的mysql[d].sock路径,连接数据库时,PHP的MySQL函数会抛出以下错误:
SQLSTATE[HY000] [2002] No such file or directory
在MySQL查看unix socket状态
可以通过以下命令查看unix socket状态:
mysql>show variables like ‘%sock%‘;
+-----------------------------------------+---------------------------+ | Variable_name | Value | +-----------------------------------------+---------------------------+ | performance_schema_max_socket_classes | 10 | | performance_schema_max_socket_instances | -1 | | socket | /var/mysql/mysql.sock | +-----------------------------------------+---------------------------+ 3 rows in set (0.00 sec)
如果不socket的位置和你实际位置不一样。可以使用ln命令进行链接一下
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
以上是关于php关于mysql数据库简单回滚问题的主要内容,如果未能解决你的问题,请参考以下文章
PHP:如果用户未按下提交按钮,Mysql 回滚多个查询(通过 ajax 完成)