spring的聲明式事務,及redis事務。


Redis的事務功能詳解

 http://ghoulich.xninja.org/2016/10/12/how-to-use-transaction-in-redis/

MULTI、EXEC、DISCARD和WATCH命令是Redis事務功能的基礎。

使用MULTI命令便可以進入一個Redis事務。這個命令的返回值總是OK。此時,用戶可以發出多個Redis命令。Redis會將這些命令放入隊列,而不是執行這些命令。一旦調用EXEC命令,那么Redis就會執行事務中的所有命令。

相反,調用DISCARD命令將會清除事務隊列,然后退出事務。

在事務運行期間,雖然Redis命令可能會執行失敗,但是Redis仍然會執行事務中余下的其他命令,而不會執行回滾操作

DISCARD命令可以用來中止事務運行。在這種情況下,不會執行事務中的任何命令,並且會將Redis連接恢復為正常狀態。

作為WATCH命令的參數的鍵會受到Redis的監控,Redis能夠檢測到它們的變化。在執行EXEC命令之前,如果Redis檢測到至少有一個鍵被修改了,那么整個事務便會中止運行,然后EXEC命令會返回一個Null值,提醒用戶事務運行失敗。

Spring Framework 中啟動 Redis 事務操作

http://www.cnblogs.com/yangwn/p/5260670.html

@Transactional注解事務不回滾不起作用無效

https://blog.csdn.net/u011410529/article/details/54287307

Spring聲明式事務為何不回滾

 https://www.jianshu.com/p/f5fc14bde8a0

聲明式事務是通通過AOP動態代理實現的,這樣會產生一個代理類來做事務管理,而目標類(service)本身是不能感知代理類的存在的。

對於加了@Transactional注解的方法來說,在調用代理類的方法時,會先通過攔截器TransactionInterceptor開啟事務,然后在調用目標類的方法,最后在調用結束后,TransactionInterceptor 會提交或回滾事務,大致流程如下圖:

總結,在方法 A 中調用方法 B,實際上是通過“this”的引用,也就是直接調用了目標類的方法,而非通過 Spring 上下文獲得的代理類,所以事務是不會開啟的。

解決方法:

1、不字節調用,把要調用的聲明為bean。

2、用   AopContext.currentProxy()獲取到本類的當前代理對象,然后用這個對象去調用該方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM