首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

php mysqli事务

基础概念

PHP中的mysqli扩展提供了对MySQL数据库的访问。事务(Transaction)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。事务具有原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID特性。

相关优势

  1. 原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  3. 隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务。
  4. 持久性:一旦事务提交,则其结果就是永久的,即使系统崩溃也不会丢失。

类型

事务分为两种类型:

  1. 隐式事务:默认情况下,MySQL在执行DML(数据操纵语言)语句时自动开启和提交事务。
  2. 显式事务:需要手动开启、提交或回滚事务。

应用场景

事务常用于以下场景:

  • 银行转账
  • 订单处理
  • 多用户同时操作同一数据

示例代码

以下是一个使用mysqli进行显式事务处理的示例:

代码语言:txt
复制
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 开启事务
$conn->begin_transaction();

try {
    // 执行SQL语句
    $sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
    $sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";

    if ($conn->query($sql1) === TRUE && $conn->query($sql2) === TRUE) {
        // 提交事务
        $conn->commit();
        echo "转账成功";
    } else {
        // 回滚事务
        $conn->rollback();
        echo "转账失败";
    }
} catch (Exception $e) {
    // 发生异常时回滚事务
    $conn->rollback();
    echo "发生异常: " . $e->getMessage();
}

// 关闭连接
$conn->close();
?>

可能遇到的问题及解决方法

  1. 事务未提交或回滚
    • 问题:事务未正确提交或回滚,导致数据不一致。
    • 原因:可能是由于代码逻辑错误或异常未捕获。
    • 解决方法:确保在所有可能的退出点(如returnthrowdie等)之前提交或回滚事务,并使用try-catch块捕获异常。
  • 死锁
    • 问题:多个事务互相等待对方释放资源,导致程序停滞。
    • 原因:事务之间的资源竞争。
    • 解决方法:优化事务逻辑,减少事务持有锁的时间,或使用数据库的死锁检测和解决机制。
  • 事务隔离级别
    • 问题:不同事务隔离级别可能导致脏读、不可重复读或幻读。
    • 原因:事务隔离级别设置不当。
    • 解决方法:根据应用需求选择合适的事务隔离级别,如READ COMMITTEDREPEATABLE READ等。

参考链接

希望这些信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PHP+Mysqli 事务处理

MYSQL php PHP+Mysqli 事务处理 php+mysqli 事物处理 事物就是如果两条或多条数据只要有一条SQL语句错误,那么已经执行成功的执行回滚操作,把已经生效的SQL语句回滚为原来的值...原来有100元,B也有100元,A向B转账50元,那么就要执行两条SQL语句,一个是A的余额要减50,B的余额要加50, 如果第一条语句成功了,但是第二条语句失败了,那么就会丢失数据了,这个时候就需要事务处理了...('utf8');//设置数据库字符集 $mysqli->autocommit(false); // 开始事务 $sql ='...true:false;//第二条SQL语句状态 if($status_1 && $_status_2){//判断两条SQL语句状态,如果都为true,则提交事务,否则回滚 $mysqli-...>commit();//提交事务 }else{ $mysqli->rollback();//回滚 } } $mysqli->autocommit(true);//关闭事务 $mysqli

1K10

PHP中的MySQLi扩展学习(四)mysqli的事务与预处理语句

对于 MySQLi 来说,事务和预处理语句当然是它之所以能够淘汰 MySQL(原始) 扩展的资本。我们之前也已经学习过了 PDO 中关于事务和预处理语句相关的内容。...所以在这里,我们就不再多讲理论方面的东西了,直接上代码来看看 MySQLi 中这两大特性与 PDO 在使用上的区别。 事务处理 首先,我们还是要让 MySQLi 对于错误的语句也报出异常来。...try { // 开始事务 $mysqli->begin_transaction(); $mysqli->query("insert into tran_innodb (name...12)"); // 不存在的表 // 提交事务 $mysqli->commit(); } catch (Exception $e) { // 回滚事务 $mysqli...预处理语句 总体来说,事务的处理和 PDO 的区别不大,但是预处理语句和 PDO 中的使用的区别就有一些了。首先是我们的 MySQLi 中的占位符只有 ? 问号占位。

2.4K00
  • PHP中的MySQLi扩展学习(一)MySQLi介绍

    ,MySQL(原始)扩展肯定是不推荐了,就算是老的项目,只要是支持 PDO 或 MySQLi 的 PHP 版本,都应该考虑将数据库的连接转换成这两种方式之一。...如果你还在 PHP5 的环境中学习 MySQL(原始)扩展的使用的话,也可以放下了。 而对于 PDO 和 MySQLi 的选择来说,就仁者见仁智者见智了。...当然,小众并不意味着不好,就像日常开发中,我们很少会在 PHP 环境中使用别的数据库,那么在自己的小项目中完全使用一套 MySQLi 来操作数据库反而更加地方便快捷。...扩展的安装及 MySQL8 需要注意的地方 MySQLi 的扩展是随 PHP 源码一起发布的,我们在编译 PHP 的时候加上 --with-mysqli 就可以了。...而 PHP7.2.4 之前的版本中的 MySQLi 会使用 mysql_native_password 来对连接密码进行加密,这样就会导致无法连接上数据库。

    2.9K00

    PHP中的MySQLi扩展学习(一)MySQLi介绍

    PHP中的MySQLi扩展学习(一)MySQLi介绍 关于 PDO 的学习我们告一段落,从这篇文章开始,我们继续学习另外一个 MySQL 扩展,也就是除了 PDO 之外的最核心的 MySQLi 扩展。...扩展的安装及 MySQL8 需要注意的地方 MySQLi 的扩展是随 PHP 源码一起发布的,我们在编译 PHP 的时候加上 --with-mysqli 就可以了。...测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202009/source/4.PHP中的MySQLi扩展学习(一)MySQLi...介绍.php 参考文档: https://www.php.net/manual/zh/mysqli.requirements.php https://www.php.net/manual/zh/mysqli.installation.php...https://www.php.net/manual/zh/mysqli.overview.php https://www.php.net/manual/zh/mysqli.quickstart.dual-interface.php

    2.9K20

    PHP扩展 Mysql 与 Mysqli

    从 PHP 5.5.0 起这个扩展已经被废弃,并且从 PHP 7.0.0. 开始被移除。 作为替代,可以使用 mysqli 或者 PDO_MySQL 扩展代替。 MySQL 增强版。...特性比较 特性 mysqli mysql PHP版本 >=5.0 >3.0 MySQL开发状态 活跃 仅维护 MySQL建议使用 首选 建议 API的字符集支持 是 否 存储过程支持情况 是 否 多语句执行支持情况...相关概念 MySQL 与 MySQLi 都是PHP方面的函数集。 在 PHP5 版本以后,增加了mysqli的函数功能。 某种意义上讲,它是MySQL系统函数的增强版,更稳定更高效更安全。...在 PHP5.3.0 版本中被引入。 在 PHP5.4 之后的版本mysqlnd被作为默认配置选项。 由zend公司开发的MySQL数据库驱动。...建议 PHP版本为5.x建议使用 mysqli 扩展。 PHP版本为7 只能使用 mysqli 扩展。 Thanks ~

    2.9K30

    PHP Mysqli 常用代码集合

    PHP5.0开始,不仅可以使用早期的mysql数据库扩展函数,还能使用新扩展的mysqli技术实现与mysql数据库的信息交流,PHP的mysqli扩展被封装在在一个类中,它是一种面向对象技术,只能在PHP5...和MYSQL4,1或更高的版本才能使用,(i)表示该进,使用mysqli,执行速度更快,更方便,更高效,也可以使数据库访问更安全(因为用类模式) 使用mysqli 简单流程 设置PHP.ini 配置文件...建立MYSQL配置文件 config.ini.php config.ini.php 内容如下: 微信图片_20191129171010.jpg 用mysqli链接MYSQL数据库: 微信图片_20191129171025..."执行成功";  }else{     $mysqli->rollback();     echo "执行失败";  } 5.恢复MYSQL事务处理的自动提交模式  $mysqli->cutocommit....jpg 以上就是PHP Mysqli 常用代码集合所有详细内容。

    1.8K20

    通过 PHP Mysqli 扩展与数据库交互

    2、PHP MySQLi 扩展 PHP 官方提供了很多用于与 MySQL 服务器进行交互的扩展,从最早的 mysql 到后来增强版的 mysqli(更加安全),它们都是 PHP 函数式编程时代的扩展包,...一般来说,本地 PHP 集成开发环境都会自带 mysqli 扩展: ?...2.1 数据库连接与查询 示例代码 在 php_learning 目录下新增一个 mysql 子目录,然后在该子目录下新建一个 mysqli.php 文件,编写一段通过 mysqli 扩展 API 建立数据库连接和查询的代码...这里我们通过 mysqli_fetch_all 函数获取所有查询结果,通过 php -S localhost:9000 启动 PHP 内置 HTTP 服务器: ?...更多细节,我这里就不一一介绍了,感兴趣的同学可以自行去 PHP 官方文档 查看 mysqli 扩展介绍。

    3.1K20
    领券