mysqlのトランザクション

5822 ワード

最近はデータベースのトランザクション操作が頻繁に使われていますが、トランザクションが何をしているのかはよく知られていますが、なんだかよくわからないので、ここで記録します.
1、トランザクションの概念:簡単に言えば、トランザクションはsql文のセットであり、1つのsqlを使用することも、1つのsqlを使用することもでき、トランザクションを開いた後、成功するか、データベース保存をコミットすることもできます.いずれも失敗するか、1つの失敗があればすべて失敗する.
2、事務の四大特性:
1)A、原子性を表す.原子間性とは、データベース・トランザクション全体が分割できない作業単位であることを意味します.トランザクション内のすべてのデータベース・オペレーションが正常に実行された場合にのみ、トランザクション全体が正常に実行されます.
トランザクションのいずれかのsql文が失敗すると、正常に実行されたsql文も取り消され、データベースのステータスはトランザクションを実行する前のステータスに戻る必要があります.
2)C、一致性を表す;つまり、コンシステンシとは、トランザクションがデータベースをある状態から別のコンシステンシ状態に変換し、トランザクションの開始前とトランザクションの終了後にデータベースの整合性制約がないことを意味します.
破壊される
3)I、隔離性を表す.分離性は、同時制御、シリアル化、またはロックとも呼ばれる.トランザクションの独立性には、読み書きトランザクションの各オブジェクトと他のトランザクションの操作オブジェクトが分離される必要があります.
すなわち、トランザクションがコミットされる前に他のトランザクションには表示されません.これは通常、ロックを使用して実現されます.
4)D,永続性は,トランザクションがコミットされると,その結果は永続的であり,つまりデータがデータベースに書き込まれ,ダウンタイムなどの事故が発生すればデータベースもデータを復元できることを示す.
3、よく使われる、取引をサポートするmysqlテーブルエンジンはInnoDBであるが、MyIsamは取引操作をサポートせず、データテーブルのエンジンを変更する:
alter table table-name engine=innoDB
4、mysqlコマンドラインで、システム構成変数を問い合わせる:
show variables like%commit%(この文はデータベースのコミット構成をクエリーするためによく使用されます)
5、自動コミットを開く:set autocommit=1;(ロールバック時のデータの乱れ防止)
自動コミットを閉じる:set autocommit=0;
6、テーブルロックについて:取引をサポートしないストレージエンジンMYISAMタイプのデータテーブルに対して、ユーザーが挿入、修正、削除する時、これらの操作はすぐにディスクに保存され、複数のユーザーが同時にあるテーブルを操作する時、テーブルロックを使用して同じ時間に複数のユーザーがデータベースの中で指定したテーブルを操作することを避けることができる.これにより、ユーザがデータテーブルを操作する際に干渉を受けることを回避することができる.これらの変更されたデータ・テーブルにアクセスできるのは、ユーザーがテーブルを解放する操作がロックされている場合のみです.
単一テーブルロックの操作:lock table table-name lock type;lock typeは一般的にreadとwriteがあります
複数のテーブルロック:lock table table-name 1 lock type、table-name 2 lock type、table-name 3 lock type;
操作が完了した後にロックを解除する必要がある場合:unlock tables;//すべてのロックテーブルのロックを解除しました.
7.ロールバックポイントに関する質問:
	     :save point      ;
:rollback ;
	(                   ,              rollback,         ,   )

8、いい例があります.参考にしてください.
php
/*
        
 */
$handle = mysql_connect('localhost','root','root');//mysql    
mysql_query('set names utf8');//     
mysql_query('use test');//     
mysql_query("SET AUTOCOMMIT=0");//         
mysql_query("BEGIN");//    
$sql1 = "insert into orders(id,num) values(null,2)";//      
if(!mysql_query($sql1))
{
    mysql_query('ROLLBACK');//          
    exit;
}
$sql2 = "update goods set num = num - 2";//      
if(!mysql_query($sql2))
{
    mysql_query('ROLLBACK');//          
    exit;
}
mysql_query("COMMIT");
mysql_close($handle);