• PHP+MySQL中Transaction的实现


    PHP可以方便的使用MySQLi扩展实现事务处理. 在PHP manual中有如下简单范例.

    <?php
    $mysqli 
    = new mysqli("localhost""my_user""my_password""world");

    /* check connection */
    if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
    }

    /* disable autocommit */
    $mysqli->autocommit(FALSE);

    $mysqli->query("CREATE TABLE myCity LIKE City");
    $mysqli->query("ALTER TABLE myCity Type=InnoDB");
    $mysqli->query("INSERT INTO myCity SELECT * FROM City LIMIT 50");

    /* commit insert */
    $mysqli->commit();

    /* delete all rows */
    $mysqli->query("DELETE FROM myCity");

    if (
    $result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
    $row $result->fetch_row();
    printf("%d rows in table myCity.\n"$row[0]);
    /* Free result */
    $result->close();
    }

    /* Rollback */
    $mysqli->rollback();

    if (
    $result $mysqli->query("SELECT COUNT(*) FROM myCity")) {
    $row $result->fetch_row();
    printf("%d rows in table myCity (after rollback).\n"$row[0]);
    /* Free result */
    $result->close();
    }

    /* Drop table myCity */
    $mysqli->query("DROP TABLE myCity");

    $mysqli->close();
    ?>


    即先将autocommit设置为FALSE. 这样无论使用query() 还是 prepare(), 都不会对数据库进行真实的操作, 直到调用commit()方法. 在commit方法被调用之前, 如果调用rollback()方法, 则能够回滚本次事务.


    然而在第一次使用时, rollback一直无效, 这个问题纠缠了我两个小时. 后来才在资料中看到如下解释:

    "在mysql下默认的是MyISAM存储引擎,它是一个非事务型的存储引擎,成为了MYSQL的缺省存储引擎。要想在mysql的表中支持transaction,必须要求是innodb表,而不是MyISAM。"


    注意到官方示例中也有如下语句, 将表设置为innodb.

    $mysqli->query("ALTER TABLE myCity Type=InnoDB");


    因此需要注意, 在MySQL中进行事务处理前, 需要将表设置为innodb.

    阅读全文
    类别:Sql 查看评论
  • 相关阅读:
    JfreeChart折线图 CSDN-李鹏飞
    [2012山东省第三届ACM大学生程序设计竞赛]——Mine Number
    两个对象值同样(x.equals(y) == true),但却可有不同的hash code,这句话对不正确?
    EBS TimeZone问题
    json数据转化成实体 存到数据库.
    写给大一大二大三还在迷惘中的学生
    Xamarin中Unsupported major.minor version 52.0问题解决
    解决Xamarin Android SDK Manager闪退问题
    Xamarin Forms启动自带模拟器缓慢
    Xamarin Android SDK无法更新的解决办法
  • 原文地址:https://www.cnblogs.com/platero/p/1870156.html
Copyright © 2020-2023  润新知