マルチスレッドのデータベース複製、挿入、更新の問題を解決する方法

基本的な考え方

冪等:冪等動作は、任意の回数がプログラミングに同じプライマリ影響で行われる実行生じ、その影響によって特徴づけられます。
簡単に言えば:それは電力動作であるので、実行する回数に関係なく、返された結果の効果は同じです。
べき等の操作:
1つのクエリ:クエリのクエリ数回に一度、同じデータの場合には、クエリ結果は同じです。自然の冪等の操作を選択します。

2. [削除]:削除操作が冪等、削除、削除の一つまたはデータが削除されている何回もあります。(同じ結果を返さないこと、削除するデータがないことを注意、0に戻り、削除されたデータは、複数の戻り結果複数の);
3.挿入:デフォルトマスターは、何度同じデータが力インサートない挿入キーユニークケースなど
4.更新操作:ここでは2例は以下のとおりです。

1、update t set money=100  where id=1
2、update t set money=money+100  where id=1

最初は冪等であり、第二は、冪等ではありません

概要:
冪等とあなたはJavaEEのは、高い同時実行が配布されていない問題ではありません。キーは、あなたの操作が冪等ではないです。
冪等を行うために、インターフェースデザインから任意の非冪等の操作をすることができ、設計されていません。例えば、彼は需要があると述べた:ユーザーがクリックが同意する場合、1の数が答えを支持します。読む:ユーザーがクリックが同意した場合、答えは、レコード、ユーザー、回答テーブルがある同意することを保証します。推奨するもので、テーブルへの答えを考え出したの数によって承認。システムの設計では、それはとてもチャージバック、そしてより多くのプレーお金よりも表示されないことができ、特に宝物、銀行、金融会社や他のインターネットに関わるすべてのお金は、正確である必要があり、効率的なデータに必要な賃金のようなシステムでは、主な検討事項でありますやその他の問題は、それが困難扱うようになり、ユーザ体験は良いではありません。

:ここでは、私の他の記事を参照することができ
、重複投稿に電源の問題の解決策のような8種類を

原因分析

この操作に続いて、非常に一般的です。

if(用户不存在)
{
    xxxxx
    存储用户到数据库
}
else
{
    重复推送,不采取任何措施
}

この動作は、まだ第二のスレッドが同一のデータが入力され、得られたデータベースストア同じデータ2あれば試験に合格されていた、終了していません。これは、障害の判断に至ったマルチスレッドの並行論理型プログラムです。

ソリューション

モードスタンドアロン、あなたは簡単なを使用して同期することができ、議論の回避重複ここでは、分散シナリオで問題を挿入し
、主に次のマルチスレッドデータベースソリューションを参照ここでは、プログラムの残りの部分は、上記参照に言及することができます。

パワーと重複提出するソリューションの8種類にそう

解決するために、マルチスレッドのインサート:

1、(インデックスのような)条件での書き込み時に挿入
1.1、単一のレコードが挿入され

共通のINSERT INTOは、挿入します:
INSERT INTO card(cardno, cardnum) VALUES('1111', '100');

あなたが重複するレコードを挿入しないようにしたい場合は、通常のINSERT挿入のために、我々は唯一の(例えば:CARDNOカード番号を繰り返すことはできません)を達成フィールドに一意制約を作成します。
あなたはより多くのフィールドが繰り返されないことを確実にしたい場合は、米国のユニークなインデックスを考慮することができます!
インデックス・ハンドルを作成した後:

if (该cardno在数据库表中存在) {  
    update();  
} else {   
    try {  
         insert();  
         //违反唯一性约束会报异常:InvocationTargetException 
         } catch (InvocationTargetException e) {  
         //如果重复插入已经有数据,则进行更新
         update();  
     }   
}  

問題もあり、あること、時間の墓石のテーブルのレコードを一意のインデックスを使用している場合は、バグを表示します

ここで重要な
一意の制約がそれを達成するだけのプログラムINSERT INTOステートメントによって作成されていないされていませんがあることを?

答え:はい、INSERT INTO IFは、特定の構文をEXISTSは、次のとおりです。
INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)
あなたが使用できるようにDUALは、一時テーブル、ない物理的な創造です。

次のように上記の例のための変換カード:
INSERT INTO card(cardno, cardnum) SELECT '111', '100' FROM DUAL WHERE NOT EXISTS(SELECT cardno FROM card WHERE cardno = '111')
1.2、複数のレコードを挿入します

INSERT INTO user  (id, no,add_time,remark)
select * from (
SELECT 1 id, 1 no, NOW() add_time,'1,2,3,1,2' remark FROM DUAL
UNION ALL
SELECT 1 no, 2 no, NOW() add_time,'1,2,3,1,2' remark FROM DUAL
UNION ALL
SELECT 1 no, 3 no, NOW() add_time,'1,2,3,1,2' remark FROM DUAL
) a where not exists (select no from user b where a.no = b.no)

上記達成されるにはユーザ・テーブル・フィールドは、3つのレコードを挿入し、繰り返さないされていません。
また、何のフィールドが気付い文を繰り返さないされていないMyBatisの一括書き込みを添付。

INSERT INTO user (id, no,add_time,result)
select * from (
<foreach collection="list" item="obj" separator=" UNION ALL " >
SELECT #{obj.id} id, #{obj.no} no, #{obj.addTime} add_time,#{obj.result} result FROM DUAL
</foreach>
) a where not exists (select no from user b where a.no = b.no)

更新アドレスをマルチスレッド

1、の楽観的ロックバージョンバージョン使用してアップデートする方法
シナリオ:
 例えば、2人のユーザーが同時に製品を購入するための、唯一の株式アップを!実際にデータベースの在庫レベルがなければならないマイナス2つの操作が、高い並行性の場合には、最初のユーザがデータを読み出して、この操作が完全に実行されないので、デクリメント現在の在庫の購入を完了するために、これが存在するであろう商品は売られ過ぎ!

select goods_num,version from goods where goods_name = "小本子";
update goods set goods_num = goods_num -1,version =查询的version值自增 where goods_name ="小本子" and version=查询出来的version;

データベースの特性は、それ自体を支援するための更新文が実行されると、更新ステートメントは、インデックステーブルを更新するための時間がかかるしない場合は、フィールドを満たすためにバージョンを追加等、一度に一つのスレッドが更新を入力することができますことを確実にするためにロックされるのはなぜ次の更新は、バージョン番号によって提出されたデータは、データベーステーブルの現在のバージョン番号よりも大きい場合に更新される、または我々はプログラムの安全性を保証することができますので、データは、古くなっていること、この後の更新はロックを解除する操作を実行します。
大規模なデータ量と、非中核事業のためのデータベースのハードウェア能力の高い同時低い効率、上のこの依存性
2. アップデート悲観的ロックの使用を選択...
このロックと同期した第1チェックし、同じを挿入または更新しますが、回避のデッドロックに、効率が悪い、それは単一のための同時要求を使用することをお勧めすることはできません

データロック獲得までの時間アクセス:select * from table_xxx where id='xxx' for update;
注:idフィールドが死んでいるだろう、主キーまたは一意のインデックス、またはロック・テーブルである必要があります。データのロック時間と組み合わせて使用し、一般的に伴う取引悲観的ロックの使用が非常に長く、実際の状況に応じて選択することができます;
大きなデータ量と高い同時効率これは、非中核事業のために、データベースハードウェアの能力に依存します

参考記事:
https://www.cnblogs.com/ganhaiqiang-20130831/articles/4478472.html
https://www.cnblogs.com/lihuanliu/p/6764048.html

冪等では解決:
https://www.cnblogs.com/baizhanshi/p/10449306.html
https://www.cnblogs.com/aspirant/p/11628654.html

发布了107 篇原创文章 · 获赞 14 · 访问量 4万+

おすすめ

転載: blog.csdn.net/belongtocode/article/details/103587176