對spring事務類型詳解的一點補充(關于嵌套事務)
可能大家對PROPAGATION_NESTED還不怎么了解,覺得有必要再補充一下^_^!
PROPAGATION_NESTED: 嵌套事務類型,是相對上面提到的六種情況(上面的六種應該稱為平面事務類型),打個比方我現在有一個事務主要有一下幾部分:
1,從A用戶帳戶里面減去100元錢
2,往B用戶帳戶里面添加100元錢
這樣看和以前不同的事務可能沒有什么區別,那我現在有點特殊的要求就是,A用戶有3個帳戶,B用戶有2個帳戶,現在我的要求就是只要再A用戶的3個帳戶里面任意一個減去100元,往B用戶的兩個帳戶中任意一個里面增加100元就可以了!
一旦你有這樣的要求那嵌套事務類型就非常適合你!我們可以這樣理解,
一:將“從A用戶帳戶里面減去100元錢” 和 “往B用戶帳戶里面增加100元錢”我們暫時認為是一級事務操作
二:將從A用戶的3個帳戶的任意一個帳戶里面減錢看做是“從A用戶帳戶里面減去100元錢”這個一級事務的子事務(二級事務),同樣把后面存錢的看成是另一個的二級事務。
問題一:當二級事務被rollback一級事務會不會被rollback?
答案是不會的,二級事務的rollback只針對自己。
問題二:什么時候這個一級事務會commit,什么時候會被rollback呢?
我們主要看二級里面出現的情況,當所有的二級事務被commit了并且一級事務沒有失敗的操作,那整個事務就算是一個成功的事務,這種情況整個事務會被commit。
當任意一個二級事務沒有被commit那整個事務就是失敗的,整個事務會被roolback。
還是拿上面的例子來說明吧!如果我在a的三個帳戶里面減錢的操作都被二級事務給rollback了,也就是3個帳戶里面都沒有減錢成功,整個事務就失敗了就會被rollback。如果A用戶帳戶三個帳戶里面有一個可以扣錢而且B用戶的兩個帳戶里面也有一個帳戶可以增加錢,那整個事務就算成功的,會被 commit。
看了一下覺得上面的例子好像不是很深刻,看這個情況(A用戶的3個帳戶都是有信用額度的,也就是說可以超支,但是超支有金額限制)。不過原理是一樣的,簡單點也好說明一點,祝你好運!^_^