從示例揭開非關係型資料庫Redis事務管理的面紗

2021-08-28 04:32:29 字數 2034 閱讀 7946

redis也提供事務這樣的概念,但是相對於關係型資料庫而言,redis目前對事務提供的是比較簡單的,redis只能保證乙個client發起的事務命令可以連續的執行,而中間不會插入其他的client命令,在乙個redis事務中,redis會將所有的命令放到乙個佇列中,當執行執行命令的時候redis才會批量的處理,要麼都成功,要麼都失敗,這樣就保證了 redis 事務的原子性。

一、redis開啟事務示例,關鍵字為multi和exec:

先來對redis的事務進行乙個操作,對其有個直觀的感受。

如上圖,我們先獲取了db這樣乙個string型別的值,然後使用multi命令開啟乙個事務,我們先將db修改為mongodb,然後修改為redis,queued表示此時命令被順序的放到了乙個佇列當中並沒有執行,而當我們執行exec命令的時候,事務才真的提交,並且兩條命令都被執行,最後返回了redis這樣的資訊。

二、redis取消事務示例,關鍵字為discard:

redis能夠保證在乙個事務中的所有操作按照順序執行,假如在此過程中想要取消這個事務的操作,應該如何處理呢?請看下面的示例,您將會比較清楚的了解到類似於事務回滾的功能。

先建立了乙個事務,然後修改了db,最後發現不想對其進行修改,因此使用了discard命令,事務被清空了,此時執行exec命令將會報錯。並且我們再次執行get db命令則返回沒有修改前的鍵值。

三、與redis事務相關的關鍵字watch

在redis中還有乙個事務的實現方式,類似於svn的操作,使用了資料版本的概念,假設有a,b兩個客戶端,在擁有資料的時候同時擁有乙個資料版本,當提交到服務端的時候,如果資料版本大於等於服務端的版本則表明此時資料是有效資料,也就是在此期間沒有發生過其他的變化,如果資料版本小於服務端版本的時候則表明此時資料在此期間被篡改過,因此就會出現衝突,表明該資料已經失效了。

我們來做乙個示範,開啟兩個 redis 的客戶端。

在執行a客戶端exec命令之前,我執行了b客戶端的set命令,然後再才執行的a客戶端的exec命令,此時出現了nil的結果,表面db設定不成功,原因就是使用了watch命令獲得了db當前的乙個資料版本,但是在事務執行的過程中b客戶端已經給伺服器提交了新的資料,也就是說此時服務端資料版本已經要比a客戶端watch時候新,因此提交的時候就會出現過期。

四、關於語義錯誤造成redis事務的失敗

在關係型資料庫中,乙個事務保證了事務上下文中所有操作的原子性,通俗一點講就是要麼都成功,要麼都失敗,我們已經嘗試了在redis中命令都成功的情況,事務的確能夠保證原子性的操作,那麼在有錯誤的時候呢?錯誤有兩種型別,第一是語法錯誤,也就是說在事務上下文中,命令的格式書寫出現了問題,第二是語義錯誤,也就是說語法沒有問題,命令的邏輯出現了問題。

語法錯誤:

通過上面的演示,我們發現,事務並沒有提交成功,出現了錯誤的情況,也就是說在乙個事務中,當語法出現錯誤的時候就會導致事務上下文的失敗,這很好的體現了事務的原子性。

語義錯誤:

從上圖演示結果表明在事務的上下文中,並沒***原子性,所以在編寫程式的時候一定要注意,盡量避免語義錯誤,其實我們在編寫關係型資料庫的sql或者plsql的時候語義錯誤也是百年難得一見,程式**務必保證足夠強大的容錯性。

從關係型資料庫到非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...

從關係型資料庫到非關係型資料庫

自1970年,埃德加 科德提出關係模型之後,關聯式資料庫便開始出現,經過了40 多年的演化,如今的關係型資料庫具備了強大的儲存 維護 查詢資料的能力。但在關聯式資料庫日益強大的時候,人們發現,在這個資訊 的 大資料 時代,關係型資料庫遇到了效能方面的瓶頸,面對乙個表中上億條的資料,sql語句在大資料...

從關係型資料庫到非關係型資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...