記一次壓測數據死鎖問題:并發場景為秒殺減庫存的場景,使用Jmeter并發調用秒殺接口,秒殺使用數據庫樂觀鎖,主鍵更新,正常來說不會有死鎖問題。分析框架的日志肯定不能找出什么問題,最后再mysql的binlog里面發現了死鎖的原因,Deep or long search in the lock table wait-for graph we will rollback transaction。經過官網文檔解釋:當事務等待超過200 (參數LOCK_MAX_DEPTH_IN_DEADLOCK_CHECK默認值200),mysql會認為發生了死鎖,從而回滾事務。以下截圖為官網說明:
web框架日志:
ERROR 06-27 17:46:19(Log4jFilter.java:152): {conn-10236, pstmt-21039} execute error. UPDATE coupon_pack_share cps SET cps.receiveCount = cps.receiveCount + 1 WHERE cps.shareId = ? AND cps.receiveCount + 1<= cps.limitCount
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
? ? ? ? at sun.reflect.GeneratedConstructorAccessor53.newInstance(Unknown
?? ? ? ?at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
? ? ? ? at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
? ? ? ? at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
? ? ? ? at com.mysql.jdbc.Util.getInstance(Util.java:386)
? ? ? ? at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1065)
? ? ? ? at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
? ? ? ? at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
? ? ? ? at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
? ? ? ? at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
? ? ? ? at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
mysql 日志: