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();

?>

我们经常会遇到操作一张大表,发现操作时间过长或影响在线业务了,想要回退大表操作的场景。在我们停止大表操作之后,等待回滚是一个很漫长的过程,尽管你可能对知道一些缩短时间的方法,处于对生产环境数据完整性的敬畏,也会选择不做介入。最终选择不作为的原因大多源于对操作影响的不确定性。实践出真知,下面针对两种主要提升事务回滚速度的方式进行验证,一种是提升操作可用内存空间,一种是通过停实例,禁用 redo 回滚方式进行进行验证。

仔细阅读过官方手册的同学,一定留意到了对于提升大事务回滚效率,官方提供了两种方法:一是增加 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 完成)

mysql中innodb数据库事务修改多记录

MySQL通过Binary Log简单实现数据回滚

关于wamp的HTML, PHP, mysql 三者的操作与联系 - mysql简单配置

关于MySQL回滚机制

通过 PHP 将 MySQL 数据传递给模态表单