ジャンゴで-トランザクション業務
トランザクションは、それはジャンゴで動作しますか?
最近、同社は、Djangoの開発金融関連のシステムを使用するように設定します。
お金が関与する.....安全金庫
半分にお金場合は、システムの崩壊は、になって?
お金が半分に送金した場合、システムの崩壊は、になって?
物事が半分を取得した場合、システムの崩壊、になって?
私はお金の半分に、お金が私の口座から引き落とされていて行くが、サービスの問題、そして失われた時に、このタスクの半分は、その後、私のお金を停止して実行するために???
これは重大な損傷を与える可能性がありますか?
方法は?
MySQLデータベース、それでアトミック操作を覚えていますか?
覚えていないのですか??!!!
まあ、私はあなたを教えてください。
顧客に転送お金を与えるために、クライアントBは、これは、データベース内の2つの手順が必要です。
1.顧客Aマイナスお金
2.顧客Bプラスお金
、第1工程の終了後に、サーバが異常である場合、データベースはトランザクション・オペレーションを使用する場合、前の操作がロールバックするときに、第2のステップは、本当に異常で行われず、停止しました。
いずれかのすべてが正常に実行され、または実行のいずれ:簡単に言えません
この操作は、原子ロールバック操作データベースと呼ばれています。
しかし、ああ、これは我々がそれで、DjangoのORMに行ってどのように、MySQLデータベースのですか?
まず第一に、私たちは、Djangoの内蔵のモジュールをインポートする
django.db輸入取引から
その後、あなたは使用することができ
django.db輸入取引から
)(transaction.atomicで:
// ORM操作
パス
私たちは、テストの例を与え
、プロジェクトを作成します。新しいアプリを作成(基本的な操作を、ここではそれらを繰り返すない)1。
ORMによって生成されたテーブルを作成します。2.
django.db輸入モデルから
クラスのUserInfo(models.Model):
ユーザ名= models.CharField( "用户"、MAX_LENGTH = 32)
バランス= models.CharField( "余额"、MAX_LENGTH = 32)
注ああ:ステップピット、小数ああを伴う財務計算を伴うが、特に正確な必要と、私たちは、文字列が格納されている使用します。
財務計算した場合、我々は計算され、小数点を使用しています。
3.私たちは、二人のユーザ間のシミュレート転送に使用され、データベースへの2つのデータを追加します
4.設定URL
ビューに対応する関数を作成します。5.
复制代码
django.shortcutsからはHttpResponseと、レンダリングインポート
app01輸入モデルから
django.db輸入取引から
Fをインポートdjango.db.modelsから
DEF指数(要求):
試してください:
()transaction.atomic有する:
models.UserInfo.object.filter(ID = 1).update(バランス= F( "バランス") - 100)
models.UserInfo.object.filter(ID = 2).update(バランス= F( "バランス")+ 100)
Eなどの例外を除い:
リターンのHttpResponse( "出现错误<%S>" %のSTR(E))
リターンのHttpResponse( "执行成功")
复制代码
私たちは、インデックスにアクセスするときは、転送動作を行います
6.今、私たちは彼にエラーをしましょう
复制代码
django.shortcutsからはHttpResponseと、レンダリングインポート
app01輸入モデルから
django.db輸入取引から
Fをインポートdjango.db.modelsから
インデックスDEF(要求):
トライ:
transaction.atomic有する():
models.UserInfo.object.filter(= ID 1).Update(バランス= F.( "バランス") - 100)
エラーレイズ
models.UserInfo.object。フィルタ(ID = 2).Update(バランス= F.( "バランス")+ 100)
例外としてE除く:
のHttpResponse( "エラー<%S>" STR%の(E))が返す
戻りのHttpResponse( "成功の実装")
コードをコピー
もう一度、我々はSQLエラーの無いアトミック操作データ、我々最初の完全な実装場合、データベースファイルを表示、そのお金を差し引かなければなりません
しかし、我々はあなたがえっ減少お金がないことがわかります、アトミック操作です。
パーフェクト、何も間違っています
これは、と他の方法に加えて、日常の動作であります
トランザクション全体ビューのオープンビューは、
コードをコピー
django.db輸入取引から
transaction.atomic @
DEF指数(要求):
// ORM運用
リターンは....
コードのコピー
注:Doがでエラートラップ原子をふさぎません
ユーザーがアトミック・ブロックを終了すると、それは通常の出口である場合や、Djangoは見に行きますコミットまたはロールバックするかどうかを決定するために例外が存在する場合
あなたがアトミック・ブロックをキャッチし、ハンドルの例外場合、それは問題はジャンゴで発生したという事実を隠すことがあります。これは、予期しない動作を引き起こす可能性があります。