44

私が理解している限りでは、以下の例のように、$mysqli->autocommit(FALSE);ステートメントを呼び出すとトランザクションが開始$mysqli->commit();し、コマンドを呼び出した後に終了します。

<?php
//Start transaction 
$mysqli->autocommit(FALSE);
$mysqli->query('UPDATE `table` SET `col`=2');
$mysqli->query('UPDATE `table1` SET `col1`=3;');
$mysqli->commit();
//End transaction

//Executing other queries without transaction control
$mysqli->query("Select * from table1");
$mysqli->query("Update table1 set col1=2");
//End of executing other queries without transaction control

//Start transaction 
$mysqli->autocommit(FALSE);
$mysqli->query('UPDATE `table` SET `col`=2');
$mysqli->query('UPDATE `table1` SET `col1`=3;');
$mysqli->commit();
//End transaction
?>

正しく理解できましたか?実際にトランザクションを実際に使用するのは初めてなので、そうでない場合は訂正してください。

ありがとうございました。

4

5 に答える 5

35

2020 年 11 月の更新: @Dharmanは、mysqli のトランザクションの詳細についてより良い回答を提供しました。代わりに確認してください: https://stackoverflow.com/a/63764001/569101


php docによると、あなたは正しいです。

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

$mysqli->query("CREATE TABLE Language LIKE CountryLanguage");

/* set autocommit to off */
$mysqli->autocommit(FALSE);

/* Insert some values */
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Bavarian', 'F', 11.2)");
$mysqli->query("INSERT INTO Language VALUES ('DEU', 'Swabian', 'F', 9.4)");

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

/* drop table */
$mysqli->query("DROP TABLE Language");

/* close connection */
$mysqli->close();
?>

上記の例では:

  • これCREATE TABLEはデフォルトの動作であるため、自動コミットされます。
  • のため、自動コミットINSERT INTO されませんautocommit(FALSE)
  • によってがリセットされたため、DROP TABLEは自動コミットされます。autocommit(FALSE)->commit();
于 2012-08-23T12:59:12.837 に答える
33

ドロップテーブルを除いて、j0kは主に正しいです。

自動コミットは、->commit()

代わりに、DROP TABLE は DDL クエリであり、DDL クエリは常に暗黙的にコミットされ、以前にコミットされていないすべての作業をコミットします。

そのため、作業をコミットしなかった場合、DDL クエリはこのコミットを強制します。

于 2013-05-24T09:02:00.757 に答える
12

SQL ステートメントを 1 回準備してから、数回実行します。

<?php
$Mysqli = new mysqli("host","user","pass","base");

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

// some data for db insertion
$countries=['Austria','Belgia','Croatia','Denmark','Estonia'];

// explicitly begin DB transaction
$Mysqli->begin_transaction();

// prepare statement (for multiple inserts) only once
$stmt=$Mysqli->prepare("INSERT INTO table(column) VALUES(?)");

// bind (by reference) prepared statement with variable $country
$stmt->bind_param('s',$country);

// load value from array into referenced variable $country
foreach($countries as $country)
{
  //execute prep stat more times with new values
  //$country is binded (referenced) by statement
  //each execute will get new $country value
  if(!$stmt->execute())
  {
    // rollback if prep stat execution fails
    $Mysqli->rollback();
    // exit or throw an exception
    exit();
  }
}

// close prepared statement
$stmt->close();

// commit transaction
$Mysqli->commit();

// close connection
$Mysqli->close();

?>
于 2016-07-16T21:08:04.610 に答える
11

commitに自動的に切り替わると思いますautocommittrue? PHP Docのコメントには NO! と書かれています。

于 2013-01-04T15:49:14.613 に答える