2016-11-17 11 views
1

私たちはMySQLからPostgreSQLに移行しました。毎分の特定の行が大幅に更新されます。 MySQLで製品が動作していた期間は問題はありませんでしたが、PostgreSQLに移行した後、私たちは非常に多くのデッドロックに直面しました。同時更新MySQLとPostgreSQL?

テーブル構造。

Create table tab(col1 int , col2 int , col3 int, PRIMARY KEY(col1)); 

インデックスがありません。

デッドロッククエリ -

Update tab set col2=col2+1 where col3=xx; 

(はい、結果に対して複数の行が存在することになります)。

私の質問:デッドロックを回避するためにMySQLがこの状況をどのように処理しましたか? (この質問については、このクエリに関するPostgreSQLの問題は、同時更新が行われるたびに異なる順序で行が取得されるためであると仮定します)。

私もデッドロックに直面しているかもしれませんが、PostgreSQLでどのように起こったのかは間違いありませんでした。

https://dba.stackexchange.com/questions/151813/why-can-mysql-handle-multiple-updates-concurrently-and-postgresql-cant ここに投稿された回答は、著者がPostgreSQLとHOTアップデートのアップデートアーキテクチャに不満を募らせていたため、それほど説得力がありませんでした。

この問題を避けるためにMySQLを有効にしたアーキテクチャの違いを知りたいと思います。

+0

私は、これはどちらかここに質問として、スタックオーバーフローが適切であるかわからない、より具体的なアプリケーションの解決の問題は 'されていませんどのようにこのアプリケーションはこれを行うのですか?... mysqlはオープンソースなのでmysql開発者コミュニティに相談します – MageeWorld

+0

なぜダウンボートを取得しているのか分かりませんが、これはかなり賢明です。 –

+0

詳細については、http://dba.stackexchange.com/q/151813/1822をご覧ください。 –

答えて

1

MySQL(おそらくはInnoDBテーブル)はたぶん一貫した順番で更新を行いますが、PostgreSQLのアクセスは一般的に順不同です。これは、InnoDBがPostgreSQLがヒープを使用している間に索引構成表を使用するため、理にかなっています。

PostgreSQLは残念ながらUPDATE ... ORDER BYをサポートしていません。 UPDATEの前に行ロックを取ることで、信頼性の高い発注を保証することができます。

BEGIN; 
SELECT 1 FROM tab WHERE col3 = xx FOR UPDATE; 
UPDATE tab SET col2=col2+1 WHERE col3=xx; 
COMMIT; 

(Iは、PostgreSQLでUPDATE ... ORDER BYサポートしているのが大好きです。パッチ歓迎!)

+0

私は同意します。おそらく、InnoDBテーブルは常にクラスタ化されたインデックスであるという事実と関係しています。 –

関連する問題