取引の目的:
(1)データのセキュリティを確保するために。
例えば:送金シナリオ、元の状態に別段のロールバック操作、データベースに書き込ま完了したトランザクションを完了している2つのステップを開いた後、-100 100、B + 100は、2段階の操作を持っているがBに移しました。
(2)複数の表に関する場合の動作(例えば、テーブルが関連付けられています)
これは、関連の削除特定のテーブルには、データエラーを削除した場合、それは、すでに取引を通じて、この問題を解決することが可能である、データが、次は削除することはできない関連するテーブルやその他の問題を削除、または正常に削除されますまたは移動しないでください。
導入サービス:
MySQLのトランザクションは、主に大規模なデータ操作、プロセスの高い複雑のために使用されています。たとえば、人事管理システムでは、あなたはスタッフの基本的な情報を削除する必要があり、データベース操作文は、トランザクションを構成するように、スタッフは、などのメール、記事、などの関連情報を、削除する必要があり、つまり、人を削除します!
唯一のMySQLデータベースエンジンでのみサポート取引InnoDBデータベースやテーブルを使用していました。
トランザクションは、SQL文の大部分は、すべての実行またはすべての実行されていないいずれかのことを保証するために、データベースの整合性を維持するために使用することができます。
挿入、更新、削除の文のトランザクション管理。
一般的に言って、トランザクションが4つの条件(ACID)を満たす必要があります::アトミック(も不可分として知られている原子性)、一貫性(一貫性)、アイソレーション(も独立として知られている分離、)、永続性(耐久性) 。
4つの条件が導入されています。
原子性:すべて1つのトランザクションですべての操作(トランザクション)が完了されるか、または完了していない、リンクの途中で終わりません。トランザクションの実行中にエラーが発生したトランザクションが同じことを行ったことがないとして、それは、トランザクションの開始前の状態に(ロールバック)にロールバックされます。
一貫性:トランザクションが開始され、トランザクションの終了後に、データベースの整合性が破損していない前に。これは、書き込まれたデータは、データの正確性を含んでいるデフォルトのルールのすべて、に完全に準拠しなければならないことを意味し、フォローアップのデータベースのシリーズは、自然発生的にスケジュールされた作業を完了することができます。
分離:同時トランザクション・データベースの複数の同時読み出しを可能にし、機能を記述し、そのデータを変更する複数のトランザクションが同時に矛盾したデータにクロス実行結果を実行するとき、分離を防止することができます。非コミット読み取り(非コミット読み取り)を含む異なるレベルに分割トランザクション分離は、(コミット読み取り)、コミット読む
反復可能読み取り(反復可能読み取り)及びシリアライズ(直列化)。
耐久性:トランザクションの後、データへの変更は、システム障害が失われることはありません場合でも、永続的です。
獲得した#
取引の文言を使用してMySQL:
#デフォルトのMySQLは自動的に、挿入、更新の実装では、提出の文にSQL文が取引されるたびに削除オープンしました。
#自動参照コミット ショーグローバルのような変数を「自動コミット」; オフ自動提出を: SET グローバル自動コミット= 0 ; オープン: SET グローバル自動コミット= 1 ;
操作:
#オープン取引が
始まる;
または:
トランザクションを開始;
#ロールバック
注:ロールバックした後、トランザクションが終了
ROLLBACKを;
#提出
注:提出した後、トランザクションの終了を
コミット。
注意:トランザクションはコミット遭遇他の操作を行うことになった後、ハードディスクに書き込まれます、ロールバックが開いているトランザクションの時にロールバックします会いました
トランザクションを使用してpymysqlモジュール:
#設定が自動的に送信されません
#注:メッセージは、一時的に設定されたデータベースに自動的にそれを提出することで一貫性のあるデータベースの設定が実行されていない場合
mysql_conn.autocommit(偽)
モックマネーのシナリオ:
最後の実行:
注意:
データ不安の問題は、(1)、同時に2つを行うことが起こらなかった、トランザクションがロックを開きます、唯一の変更操作がコミットまたはロールバックは次の操作を実行するだけの後に行われます。
半分のクラッシュを実行する場合(2)、それだけでコミットするデータベースに書き込まれたデータベースには影響しません。
(3)更新動作時に、クエリデータは、データがコミットされていない場合
サンプルコード:
インポートpymysqlの インポート時 mysql_conn = pymysql.connect(ホスト= " 192.168.1.100 "、ユーザ= " mysql_proxy_user "は、passwd = " 123456 "、ポート= 3307、DB = " テスト"、文字セット= " UTF8 " ) カーソル = mysql_conn。カーソル(カーソル= pymysql.cursors.DictCursor) START_TIME = time.time() プリント(' 开始时间:'、time.strftime(' %Y-%M-%D%X ')) #閉じる自動的に提出 mysql_conn.autocommit(偽) のtry : #HQへzezhou転送お金、10 HQ + cursor.execute(' アップデートのテストSET +マネー=マネーID =%S%S; '、(' 10 '、' 2 ' )) time.sleep( 7 ) #上げはTypeError( '123') #1 zezhou-10 cursor.execute(' 更新テストセットマネーID = money-%S =%S; '(' 10 '、' 1 ' )) #通常、完成し、永続操作 mysql_conn.commit() を除くAS例外E: #ロールバック操作与えられた mysql_conn.rollback() 印刷(' 総実行時間:'、time.time() - START_TIME) cursor.close() mysql_conn.closeを()