spring cloud服務連線超時解決方法
一 . feign連線超時解決方法
在配置檔案中新增配置(application.propeties)
設定超時時間5秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
或者設定不超時
hystrix.command.default.execution.timeout.enabled: false
二 . 超時案例
做專案時有一個介面,服務A呼叫服務B,服務B又呼叫服務C,服務C返回服務B,服務B有呼叫服務A。。。。好暈,直接上圖吧。
因為request更改了資料表,之後呼叫workflow,事務沒有提交在等待方法執行完,workflow又反過來呼叫request更新資料表,因為是同一條資料,之前的沒提交,所以就一直等待他提交,這樣就死鎖了,不管怎麼設定超時時間都沒有用的。
在這裡惡補一下資料庫的事務問題。
事務隔離級別
事務隔離級別由弱到強分別是:READ_UNCOMMITTED(未提交讀)、READ_COMMITTED(提交讀)、REPEATABLE_READ(重複讀)和SERIALIZABLE(序列讀)。
隔離界別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
READ_UNCOMMITTED | 允許 | 允許 | 允許 |
READ_COMMITTED | 不允 | 允許 | 允許 |
REPEATABLE_READ | 不允 | 不允 | 允許 |
SERIALIZABLE | 不允 | 不允 | 不允許 |
髒讀:
髒讀指的是一個事務允許讀取其他正在執行的事務還沒有提交的資料,這種情況的發生主要因為沒有加鎖。不可重複讀:
是指在一個事務內,多次讀同一資料。在這個事務還沒有結束時,另外一個事務也訪問該同一資料。那麼,在第一個事務中的兩次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為是不可重複讀。(即不能讀到相同的資料內容)
例如,一個編輯人員兩次讀取同一文件,但在兩次讀取之間,作者重寫了該文件。當編輯人員第二次讀取文件時,文件已更改。原始讀取不可重複。如果只有在作者全部完成編寫後編輯人員才可以讀取文件,則可以避免該問題。
要達到允許可重複讀,必須讓當前事務保持一個讀共享鎖。幻讀:
幻讀指的是事務不是序列發生時發生的一種現象,是事務A讀取了事務B已提交的新增資料。例如第一個事務對一個表的所有資料進行修改,同時第二個事務向表中插入一條新資料。那麼操作第一個事務的使用者就發現表中還有沒有修改的資料行,就像發生了幻覺一樣。解決幻讀的方法是增加範圍鎖或者表鎖。
MySQL的預設事務隔離級別是REPEATABLE_READ,ORACLE、SQL Server、DB2和PostgreSQL的預設事務隔離級別是READ_COMMITED
事務的特性(ACID特性)
- 原子性(Atomicity)
事務是資料庫的邏輯工作單位,事務中包括的諸操作要麼全做,要麼全不做。 - 一致性(Consistency)
事務執行的結果必須是使資料庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。 - 隔離性(Isolation)
一個事務的執行不能被其他事務干擾。 - 持續性/永久性(Durability)
一個事務一旦提交,它對資料庫中資料的改變就應該是永久性的。
流程2和流程1的區別是request的更新操作是在返回3之後,返回3是workflow呼叫request服務進行更新操作,此刻更完之後就會提交,之後request中又進行一次更新操作。
能成功的原因是,workflow呼叫request服務進行更新操作的事務和request服務自己更新操作的事務不是一個,不存在等待。
喜歡請支援,歡迎討論^^