程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> redis+rabbitmq解決mysql死鎖

redis+rabbitmq解決mysql死鎖

編輯:MYSQL入門知識
 

redis+rabbitmq
之前遇到一個郁悶的問題,日志中時不時的會報出一個如下的錯誤。


org.apache.ibatis.exceptions.PersistenceException:
### Error updating DATABASE. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found WHEN trying TO GET LOCK; try restarting TRANSACTION
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: UPDATE tbl_marketing_coupon_scheme SET coupon_count = coupon_count+? WHERE id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found WHEN trying TO GET LOCK; try restarting TRANSACTION
 

觀察後發現應該是並發數太大,導致更新mysql數據庫發生死鎖。
coupon_count的實時性要求高,且追求准確度。
苦思而不得解決辦法,最近發現用redis+rabbitmq能比較好的解決這個問題。

解決此辦法的思路是,將coupon_count存入redis緩存中。讀數據的時候,通過redis緩存讀取。
在更新數據的時候,首先更新redis緩存,其次通過消息隊列(采用了rabbitmq)更新mysql數據庫。
因為消息隊列是線性的,故不會發生死鎖。

有一種情況是,更新緩存成功,但是更新數據庫失敗了。這時候怎麼辦呢,只要再次更新緩存,問題就解決了。
 

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved