トランザクションは 4 つの条件 (ACID) を満たす必要があります: アトミック性 (Autmic)、一貫性 (Consistency)、分離 (Isolation)、耐久性 (Durability)
アトミック性 (Autmic): トランザクションは実行中に実行される必要があります。さもなければすべてを実行してください!」は、トランザクションのどの部分も実行が許可されていないことを意味します。障害によりトランザクションが完了できなかった場合でも、ロールバック時にデータベースへの影響を排除する必要があります。
一貫性: トランザクション操作では、データベースをある一貫した状態から別の状態に変換する必要があります。オンラインショッピングを例に挙げると、倉庫から商品を取り出して顧客の買い物かごに入れることによってのみビジネスを生み出すことができます。
分離: 複数のトランザクションが同時に実行される場合、各トランザクションが独立して実行されているかのように見える必要があります。
耐久性: 正常に実行されたトランザクションは、データベースに永続的な影響を及ぼします。たとえデータベースに障害が発生しても、回復できるはずです。
MYSQL でのトランザクション処理には主に 2 つの方法があります。 In1. Begin、Rollback、Commit を使用して実装します
トランザクションの開始を開始します
トランザクションのロールバックをロールバックします
トランザクションをコミットします
ロールバックとコミットを同時に使用する場合は、前のもののみが有効です。後者はコミットまたはロールバックのどちらを実行しても無効です
2. set を直接使用して、mysql の自動送信モードを変更します MYSQL はデフォルトで自動的に送信されます。つまり、クエリを送信すると、直接実行されます。トランザクション処理は次の方法で実装できます
use ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ set autocommit=0
set autocommit=0 を使用すると、コミットまたはロールバックで確認するまで、後続のすべての SQL がトランザクションとして処理されることに注意してください。このトランザクションを終了すると、新しいトランザクションも開始されることに注意してください。最初の方法によれば、現在のものだけがトランザクションとして使用されます。
トランザクション処理をサポートできるのは、MYSQL の INNODB および BDB タイプのデータ テーブルのみです。他のタイプはサポートされていません。
***: 通常、MYSQL データベースのデフォルトのエンジンは MyISAM です。このエンジンはトランザクションをサポートしません。 MYSQL でトランザクションをサポートしたい場合は、手動で変更できます:
方法は次のとおりです: 1. c:appservmysqlmy.ini ファイルを変更し、skip-InnoDB を見つけて先頭に # を追加して、ファイルを保存します。
2. 操作中に「services.msc」と入力して、mysql サービスを再起動します。
3. phpmyadmin、mysql->show エンジンに移動し (または、mysql->show 変数 ('have_%'; など) を実行し、InnoDB が YES (データベースが InnoDB をサポートしていることを意味します) であることを確認します。
これは、トランザクショントランザクションがサポートされていることを意味します。
4. テーブルを作成するときに、ストレージ エンジンとして InnoDB エンジンを選択できます。以前に作成したテーブルの場合は、mysql->alter table table_name type=InnoDB; または mysql->alter table table_name Engine=InnoDB; を使用して、トランザクションをサポートするようにデータ テーブルのエンジンを変更できます。
例 1.
$conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!"); mysql_select_db('test',$conn); mysql_query("set names 'GBK'"); //使用GBK中文编码; //开始一个事务 mysql_query("BEGIN"); //或者mysql_query("START TRANSACTION"); $sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')"; $sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错 $res = mysql_query($sql); $res1 = mysql_query($sql2); if($res && $res1){ mysql_query("COMMIT"); echo '提交成功。'; }else{ mysql_query("ROLLBACK"); echo '数据回滚。'; } mysql_query("END");
例 2
Php コード
mysql_query("SET AUTOCOMMIT=0"); //设置mysql不自动提交,需自行用commit语句提交 $sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')"; $sql2 = "INSERT INTO `user` (`did`, `username`, `sex`) VALUES (NULL, 'test1', '0')";//这条我故意写错 $res = mysql_query($sql); $res1 = mysql_query($sql2); if($res && $res1){ mysql_query("COMMIT"); echo '提交成功。'; }else{ mysql_query("ROLLBACK"); echo '数据回滚。'; } mysql_query("END"); //事务处理完时别忘记mysql_query("SET AUTOCOMMIT=1");自动提交
トランザクションをサポートしていない MyISAM エンジン データベースの場合は、テーブル ロック メソッドを使用できます
//MyISAM と InnoDB はそれをサポートします
/ *LOCK TABLES は、現在のスレッドで使用されているテーブルをロックできます。テーブルが別のスレッドによってロックされている場合、すべてのロックが取得できるまでブロックが発生します。
UNLOCK TABLES は、現在のスレッドが保持しているロックを解放します。スレッドが別の LOCK TABLES を発行するか、サーバーへの接続が閉じられると、現在のスレッドによってロックされているすべてのテーブルのロックが暗黙的に解除されます。*/
PHP コード
mysql_query("LOCK TABLES `user` WRITE");//锁住`user`表 $sql = "INSERT INTO `user` (`id`, `username`, `sex`) VALUES (NULL, 'test1', '0')"; $res = mysql_query($sql); if($res){ echo '提交成功。!'; }else{ echo '失败!'; } mysql_query("UNLOCK TABLES");//解除锁定