繁体   English   中英

如何在 wordpress 中使用 mysql 事务?

[英]How to use mysql transaction in wordpress?

如何在 wordpress 中使用 mysql 事务? 我要删除 10 个孩子,如果有一个是活动的,则全部删除将回滚。

我从来没有尝试过它并且没有什么额外的普通但它只是运行一个查询(在START TRANSACTION之后运行你的查询并根据结果使用COMMITROLLBACK ):

mysql_query('START TRANSACTION');
$res1 = mysql_query('query1');
$res2 = mysql_query('query2');
If ( $res1 && $res2 ) {
    mysql_query('COMMIT'); // commits all queries
} else {
    mysql_query('ROLLBACK'); // rollbacks everything
}

因此,它可以使用类似的东西转换为wordpress

$wpdb->query('START TRANSACTION');
$result1 = $wpdb->delete( $table, $where, $where_format = null );
$resul2 = $wpdb->delete( $table, $where, $where_format = null );
if($result1 && $result2) {
    $wpdb->query('COMMIT'); // if you come here then well done
}
else {
    $wpdb->query('ROLLBACK'); // // something went wrong, Rollback
}

您也可以像这样的答案使用try catch (不是WordPress,但同样的想法)。 您可以在Codex上阅读有关$wpdb查询函数( querydelete )的更多信息。

MySQL的默认MyISAM存储引擎不支持事务,所以它不是一个选项。 如果要使用事务,请确保将所有表定义为InnoDB。

在 WordPress 中实现事务有点困难,因为它使用全局变量$wpdb并且因为它使用到数据库的单个连接,所以它的副作用是:

如果您运行此代码的多个实例:

$wpdb->query('START TRANSACTION');
$result1 = $wpdb->delete( $table, $where, $where_format = null );
$resul2 = $wpdb->delete( $table, $where, $where_format = null );
if($result1 && $result2) {
    $wpdb->query('COMMIT'); // if you come here then well done
}
else {
    $wpdb->query('ROLLBACK'); // // something went wrong, Rollback
}

他们可能会发生冲突并产生问题。 由于您有一个连接,您可能已经在一个线程中启动了事务,并且相同的事务传递到另一个线程,因为您有一个全局变量,它在 MySQL 连接上使用。

所以在我看来,在 wordpress 中使用交易比不使用交易风险更大。 最好的解决方案是使用 mysqli class 并在每次您想要进行事务查询时创建一个新连接。

$conn = new mysqli(WORDPRESS_DB_SERVER, WORDPRESS_DB_USER, WORDPRESS_DB_PASS, WORDPRESS_DB_NAME);
$conn->query('START TRANSACTION');
$sql = "DELETE FROM $table WHERE $where"; // ESCAPE YOUR DATA!
$result = $conn->query($sql);
$res1 = $conn->query('query1');
$res2 = $conn->query('query2');
If ( $res1 && $res2 ) {
     $conn->query('COMMIT'); // commits all queries
} else {
     $conn->query('ROLLBACK'); // rollbacks everything
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM