下に起因するPostgreSQLの更新の同時実行のデッドロック

まず、デッドロックの背景

レシート一括印刷は、デッドロックによって引き起こされる非同期同時印刷トリガーの使用、トリガー同時実行で、その結果、(すべての50ミリ秒後にトリガを超える9000データ)を印刷中には、インターフェイスが更新されたとき、印刷回数は、PostgreSQLが発生した場合

次のように与えられた固有:

図1は、 ###エラーが発生しながらパラメータ設定
 2の更新組t_sc_receipt print_num =合体(print_num、0)+ 1、print_ts = ### SQLを?
3  ###原因:org.postgresql.util.PSQLException:ERROR:デッドロックが検出された
 4    详细を:ためのプロセス19540の待機ShareLockトランザクション12520113オン; プロセス19539によってブロック5つのプロセス19539のを待つためのトランザクション12520112にShareLock。プロセス19540によってブロック6    建议:サーバーのログを参照してくださいするために、クエリの詳細。
7    在位置:しばらく「t_sc_receipt」関係で更新されたタプル(329,3)を再チェック
 8  SQL []; ERROR:デッドロックが検出
 9    详细:プロセス19540のを待つためのトランザクション12520113にShareLock。プロセス19539によってブロック10のプロセス19539のを待つためのトランザクション12520112にShareLock。プロセス19540によってブロック11    建议:サーバーのログを参照してくださいするために、クエリの詳細。
12    在位置:ながら、関係"t_sc_receipt"に更新されたタプル(329,3)を再チェックしますERROR:デッドロックが検出されたネストされた例外はorg.postgresql.util.PSQLExceptionが
 13    详细:プロセス19540のを待つためトランザクション12520113上ShareLock。プロセス19539によってブロック14のプロセス19539のを待つためのトランザクション12520112にShareLock。プロセス19540によってブロック15    建议:サーバーのログを参照してくださいするために、クエリの詳細。
16    在位置:ながら "t_sc_receipt"関係で更新されたタプル(329,3)を再検査
 17      org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:263で18      org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslatorで。翻訳(AbstractFallbackSQLExceptionTranslator.java:73 19     org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73で20      org.mybatis.spring.SqlSessionTemplate $ SqlSessionInterceptor.invoke(SqlSessionTemplate.java:368で21      com.sun.proxyで。$ Proxy57.update(不明なソース)
 22      org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:254で23      com.xxx.framework.mybatis.dao.impl.MyBatisDaoImpl.updateBySql(MyBatisDaoImpl.java:531で24      com.xxxで.dscsettle.receipt.ReceiptService。updatePrintNum(ReceiptService.java:160 25     com.xxx.dscsettle.receipt.ReceiptService $$ FastClassBySpringCGLIB $$ 82e91731.invokeで(<発生> 26      org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204で27      org.springframework.aopで.framework.CglibAopProxy $ DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651 28      com.xxx.dscsettle.receipt.ReceiptService $$ $$ EnhancerBySpringCGLIB 67b6a353.updatePrintNumで(<生成> 29      com.alibaba.dubbo.common.bytecodeで.Wrapper72.invokeMethod(Wrapper72.java)
 30      com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory $ 1.doInvoke(JavassistProxyFactory.java:46で31     com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72で32      com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53で33      com.onlyou.frameworkで.log.DubboLogServiceFilter.invoke(DubboLogServiceFilter.java:28 34      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで35      com.alibaba.dubbo.rpc.filter.ExceptionFilterで。 invoke(ExceptionFilter.java:64 36      com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで$ 1.invoke(ProtocolFilterWrapper.java:69 37     com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42で38      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで39      com.alibabaで。 dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75 40      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで41      com.alibaba.dubbo.rpc.protocolで.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78 42      com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで$ 1.invoke(ProtocolFilterWrapper.java:69 43     com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:61で44      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで45      com.alibabaで。 dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:132 46      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで47      com.alibaba.dubbo.rpc.filterで.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38 48      com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで$ 1.invoke(ProtocolFilterWrapper.java:69 49     com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38で50      $ 1.invoke(ProtocolFilterWrapper.java:69 com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapperで51      com.alibabaで。 dubbo.rpc.protocol.dubbo.DubboProtocol $ 1.reply(DubboProtocol.java:98 52      com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequestで(HeaderExchangeHandler.java:98 53      com.alibabaで.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170 54      com.alibaba.dubbo.remoting.transport.DecodeHandler.receivedで(DecodeHandler.java:52 55     com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:81で56      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145で57      java.util.concurrent.ThreadPoolExecutorで$ Worker.run(ThreadPoolExecutor.java:615 58      java.lang.Thread.run(Thread.java:745で59  org.postgresql.util.PSQLException:起因するエラー:デッドロックが検出された
 60    详细:プロセス19540のを待つためトランザクション12520113上ShareLock。プロセス19539によってブロック61のプロセス19539のを待つためトランザクション12520112上ShareLock。プロセス19540によってブロック62    建议:サーバーのログを参照してくださいするために、クエリの詳細。

二、原因分析

(私たちは、先端からデッドロックがデータベースのPostgreSQLで発生与えられている知っている:検出デッドロックエラーが   絶えず更新にページング、デッドロックが発生した検出)、およびそれが起こったときに通常のロジックの下で、回を印刷するの同時更新に配置することができますレシート印刷時間が間違って行くべきではありません、ここで印刷バッチ更新の数に誤りがありました。

1.デッドロックに起因する競合リソース更新データは、データベースの行ロックをもたらすはずである場合に生じます

2.ので一括編集を使用すると、すべての変更を完了していない場合ので、インデックスは手放すことはないだろう、デフォルトのトランザクションで、このように同時アクセス数のデッドロックを生じさせます、

3.研究が問題の原因で、重複した行ロックの原因として最も可能性が高いことが判明した、私は最終的に理由があるため、コードのロジックである見つけ、それぞれその結果、空と判断されたではない一括更新idList、およびSQL私たちは、データのテーブル全体更新する必要が異なる取引によるものは、直接、デッドロックが生じ、資源、互いないのを待ちます。

 

第三に、解決の問題と拡大

バッチ更新は、デッドロックには2つのソリューションがあります

ループのための単一の変更に一括更新が、サーバー上の圧力を増加させるこの方法1。

2.データの更新の最初のスクリーニングを行い、重複データが出て削除

自身がupadateの反復を繰り返されていないため、この問題は、問題を解決するためにちょうどいいidLIst入ってくるコードを解くの中。

質問:postgresqlのデッドロックの下で同時更新はshareLockそれを発生しますか?

繰り返し通常の状況下でのアップデートでながら、デッドロックをもたらすべきではないトランザクション比較的デッドロックされている更新プログラムが発生する可能性があります。

同時に、また、我々は、ブロガーはPostgreSQLのデッドロックはいくつかのバージョンが表示され、解決するために、次の2つのパラメータを設定することで解決することができる可能性が同時更新のバグであってもよい見ました:

autovacuum_vacuum_scale_factor = 0.03
autovacuum_analyze_scale_factor = 0.03


 

参考地址:http://blog.chinaunix.net/uid-20726500-id-4773950.html
https://blog.51cto.com/372550/2387517

 

 

おすすめ

転載: www.cnblogs.com/zluckiy/p/12173497.html