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()獲取到本類的當前代理對象,然后用這個對象去調用該方法。