1

理解できないシナリオ:

DBserver と呼ばれるプロセスには 5 つのスレッドがあり、各スレッドには Mysql データベースへの接続が 1 つあります。SQL を実行するたびに、それを DB サーバーに送信すると、DB サーバーは実行するスレッドを 1 つ選択します。現在、sqlA と sqlB という 2 つの sql があり、sqlA は sqlB の前にありますが、DBserver はマルチスレッドを使用しているため、sqlA が sqlB の前に実行されるとは限りません。私の意見では、sqlB が sqlA の前に実際に実行された場合、エラーが発生します。

例えば:

sqlA:update bankTable set money = 10 where id = 10001;

sqlB:update bankTable set money = 100 where id = 10001;

sqlB が sqlA の前に実行されると、金額は最終的に 10 になります。これは 100 になるはずです。しかし、この DB サーバーはオンラインで、エラーは発生しませんでした。理由はわかりません。どうもありがとうございました!

4

2 に答える 2

1

エラーが発生する理由 あなたが言いたいのは、それはあなたが期待することではありません。それで全部です。ただし、両方のクエリは、エラーを発生させることなく、任意の順序で実行できます。

この例では、sqlA は常に sqlB の前に実行されると想定しています。これは、両方のクエリの作業が同じであり、メイン スレッドがクエリをアイドル スレッドに渡すためです。

しかし、より複雑なクエリについて話しているのであれば、ここでテーブル ロックの出番だと思います。

于 2013-04-15T11:04:23.363 に答える
1

単一の SQL クエリを抽象化しながら、ACID コンプライアンスを維持することが必要なようです。

私が提案したいのは、単一の SQL クエリ (文字列など) または SQL クエリのリストのいずれかを受け入れる SQL クエリを取るクラスを構築することです。リストは、クエリが相互に依存しており、同じ DB 接続で実行する必要があることを意味します。

これは、一時テーブルを使用する場合に特に重要です。これは、一時テーブルがデータベース接続にスコープされ、他の接続からは見えないままであるためです。

于 2013-04-15T11:12:15.710 に答える