ジェダストランザクション
JDBCを使用してMySQLに接続する場合、SQLステートメントを実行する前にトランザクションを開始する必要があります。 MyBatisでは、OpenSession()を使用してセッショントランザクションオブジェクトを取得して、SQL実行、クエリ、その他の操作を実行する必要があります。データベースでの操作が終了すると、トランザクションオブジェクトはデータベース接続を閉じる責任があります。
トランザクションオブジェクトは、さまざまなデータベース操作を管理および実行するために使用されます。データベース接続をオンにして閉じ、SQLステートメントを実行し、エラー操作をロールバックできます。
Redisには、Redis.clients.jedis.transactionの下にあるトランザクション管理オブジェクトもあります。
Jedisトランザクションの関連コード:
パッケージcn.com.redis; redis.clients.jedis.jedisをインポートします。 redis.clients.jedis.transactionをインポートします。 public class test7 {public static void main(string [] args){jedis jedis = new jedis( "192.168.248.129"、6379);トランザクショントランザクション= jedis.multi(); //トランザクションコントロールオブジェクトを返します//事前にトランザクションオブジェクトで実行される操作をプリロードトランザクション( "k4"、 "v4"); transaction.set( "k5"、 "v5"); transaction.exec(); // execute}}Redisをチェックしましょう:
データが追加されていることがわかりました
K4の値とK5の値を「V44」および「V55」に変更し、transaction.exec()ステートメントの後にtransaction.discard()ステートメントを追加します。
パッケージcn.com.redis; redis.clients.jedis.jedisをインポートします。 redis.clients.jedis.transactionをインポートします。 public class test7 {public static void main(string [] args){jedis jedis = new jedis( "192.168.248.129"、6379);トランザクショントランザクション= jedis.multi(); //トランザクションコントロールオブジェクトを返す//事前にトランザクションオブジェクトで実行される操作をプリロードトランザクション.set( "k4"、 "v44"); transaction.set( "k5"、 "v55"); transaction.discard(); //ローリングバック}}データ挿入操作がロールバックされ、Redisの2つの値が変更されていないことがわかります。
Redisトランザクションを使用してロジックを処理するために、クレジットカードを一度スワイプするトランザクションをシミュレートします。
パッケージcn.com.redis; redis.clients.jedis.jedisをインポートします。 redis.clients.jedis.transactionをインポートします。パブリッククラスのtestTransaction {//クレジットカードの消費と返済をシミュレートPublic static void main(string [] args){testtransaction t = new testTransaction(); boolean retvalue = t.transmethod(100); if(retvalue){system.out.println( "クレジットカード消費の使用の成功!"); } else {system.out.println( "クレジットカードの消費の使用に失敗!"); }} /***素人の用語では、時計コマンドはキーをマークすることです。キーがマークされている場合、 *トランザクションを送信する前にキーが他の誰かによって変更された場合、トランザクションは失敗します。この状況は通常、プログラム*で再試行できます。 * *最初に、バランスをとってから、バランスが十分かどうかを確認します。不十分な場合は、控除なしでマークをキャンセルします。 *十分な場合は、更新操作のトランザクションを開始します。 *この期間中にキー残高が他の人によって変更された場合、トランザクション(Exec)を提出するときにエラーが報告されます。 *このタイプのエラーは通常、プログラムに巻き込まれ、成功するまで再度実行できます。 * */ private boolean transmethod(int lument){system.out.println( "クレジットカードを使用して支払いを前進させる"+fomul+"yuan"); Jedis Jedis = New Jedis( "192.168.248.129"、6379); int balance = 1000; //利用可能な残高int debt; // int int amttosubtract = lument; //実際のブラッシング量jedis.set( "balance"、string.valueof(balance)); jedis.watch( "balance"); //jedis.set("balance "、" 1100 "); //この文は表示されないはずです。他のプログラムをシミュレートするために、エントリが変更されました。 balance = integer.parseint(jedis.get( "balance")); if(balance <amttosubtract){//利用可能なバランスは実際のブラシ額よりも少ない、取引はjedis.unwatch()を拒否されます。 System.out.println( "利用可能なバランスは不十分です!"); falseを返します。 } else {//利用可能な残高が十分である場合、控除操作システムを実行します。トランザクショントランザクション= jedis.multi(); Transaction.Decrby( "BALANCE"、amttoSubtract); //残高はamttosubtractの金額を引いたtransaction.incrby( "debt"、amttosubtract);債務= integer.parseint(jedis.get( "債務")); System.out.println( "債務取引取引の実行終了..."); System.out.println( "利用可能な残高:"+残高); System.out.println( "あなたは現在お金を借りています:"+債務); trueを返します。 }}}このコードは、クレジットカードを使用して100元スワイプしたユーザーをシミュレートします。現時点では、クレジットカードの利用可能な残高は100元削減され、100元の負債を増やす必要があります。
実行結果:
Redisの結果:
私たちの操作が成功したことを証明してください。
Watchコマンドは、他の操作がトランザクションを中断したり、トランザクションの実行中にトランザクションの計算結果に影響を与えたりするのを防ぐために追加され、「Illusion Reading」や「Dirty Data」などの異常な状況になります。 Watchコマンドがキーを作成します。キーが実行中に他の誰かによって変更されたことが判明すると、トランザクションは失敗します。このタイプのエラーは通常、プログラムに巻き込まれ、成功するまで再度実行できます。したがって、Watchコマンドはデータの同期を確実にすることができます。
時計コマンドの目的を証明するために、jedis.set( "balance"、 "1100")をリリースします。上記のコードでコメントし、TransMethodメソッドが中断された例外をスローします。中断されたエクセプトをスローし、主なメソッドが中断された例外をキャッチし、対応する警告ボックスがポップアップします。
パッケージcn.com.redis; java.util.listをインポートします。 redis.clients.jedis.jedisをインポートします。 redis.clients.jedis.transactionをインポートします。パブリッククラスのtestTransaction {//クレジットカードの消費と返済をシミュレートPublic static void main(string [] args){testtransaction t = new testTransaction(); boolean retvalue = false;ブールインタード= false; try {retvalue = t.transmethod(100); } catch(arturnedexception e){挿入= true; System.out.println( "トランザクションが中断されます。もう一度実行してください!"); }最後に{if(retvalue){system.out.println( "クレジットカードの使用の成功!"); } else {if(!arturned){system.out.println( "クレジットカードの使用に失敗しました!バランス不足!"); }}}}}} /***簡単に言えば、時計コマンドはキーをマークすることです。キーがマークされている場合、 *トランザクションを送信する前にキーが他の誰かによって変更された場合、トランザクションは失敗します。この状況は通常、プログラム*で再試行できます。 * *最初に、バランスをとってから、バランスが十分かどうかを確認します。不十分な場合は、控除なしでマークをキャンセルします。 *十分な場合は、更新操作のトランザクションを開始します。 *この期間中にキー残高が他の人によって変更された場合、トランザクション(Exec)を提出するときにエラーが報告されます。 *このタイプのエラーは通常、プログラムに巻き込まれ、成功するまで再度実行できます。 * */ private boolean transmethod(int lument)throws arturnedexception {system.out.println( "クレジットカードを使用して支払いを前払いする"+rument+"yuan"); Jedis Jedis = New Jedis( "192.168.248.129"、6379); int balance = 1000; //利用可能なバランスint debt; //絶対金額int amttosubtract = amon; // real brush lime limit jedis.set( "balance"、string.valueof(balance)); jedis.watch( "balance"); jedis.set( "balance"、 "1100"); //この文は表示されないはずです。他のプログラムをシミュレートするために、エントリが変更されました。 balance = integer.parseint(jedis.get( "balance")); if(balance <amttosubtract){//利用可能なバランスは実際のブラシ額よりも少ない、取引はjedis.unwatch()を拒否されます。 System.out.println( "利用可能なバランスは不十分です!"); falseを返します。 } else {//利用可能な残高が十分である場合、控除操作システムを実行します。トランザクショントランザクション= jedis.multi(); Transaction.Decrby( "BAILT"、amttosubtract); //残高はamttosubtractのお金を引いたtransaction.Incrby( "債務"、amttosubtract);実行中に変更されました。 new interruptedexception(); } else {//トランザクション提出成功した残高= integer.parseint(jedis.get( "balance"));債務= integer.parseint(jedis.get( "債務")); system.out.println( "トランザクション実行の終了..."); System.out.println( "利用可能な残高:"+残高); System.out.println( "あなたは現在お金を借りています:"+債務); trueを返します。 }}}}}もう一度実行して、効果を確認してください:
これは、Watchコマンドが実行された後、トランザクションが送信される前にデータが変更された場合、トランザクションの実行が成功しないことを示しており、データのセキュリティが保証されます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。