事務、事務的隔離特性、事務的傳播特性

關於事務的一些補充
事務的兩大知識點:隔離特性(對多個線程來說)和傳播特性(對多個線程來說)
事務的注意事項:

  1. 不要在接口上聲明@Transactional ,而要在具體類的方法上使用 @Transactional 註解,否則註解可能無效。
  2. 不要將@Transactional放置在類級的聲明中,會使得所有方法都有事務。
  3. 同一個類中調用@Transactional的方法, @Transactional無效。如果非要調用,見例1
  4. 使用了@Transactional的方法,只能是public,@Transactional註解被外部其他類調用纔有效,故只能是public。道理和上面的有關聯。其他不會報錯,但事務無效。
    一、隔離特性
    在事務的四個屬性中,隔離性又可以細分,事務的隔離級別分爲四級:未提交讀(read uncommitted)、已提交讀(read committed)、可重複讀(repeatable read)、串行化(serializable)。(在spring boot中可以在@Transactional中的value來設置)
    未提交讀
    A事務已執行,但未提交;B事務查詢到A事務的更新後數據;A事務回滾;—出現髒數據
    已提交讀
    A事務執行更新;B事務查詢;A事務又執行更新;B事務再次查詢時,前後兩次數據不一致;—不可重複讀
    可重複讀
    A事務無論執行多少次,只要不提交,B事務查詢值都不變;B事務僅查詢B事務開始時那一瞬間的數據快照;
    串行化
    不允許讀寫併發操作,寫執行時,讀必須等待,允許執行讀讀操作;

Mysql默認的事務隔離級別是可重複讀(有的人說項目中要改成讀已提交
),其實我之前做過那麼多項目一直用的是mysql的默認隔離級別。

但是MYSQl幫我們在可重複度的情況下幫我們把幻讀的情況解決了,所以,MYSQL在可重複讀的情況下是不會出現幻讀的。
二、傳播特性
事務之間的調用大至分下面幾種情況
有事務會一直傳播給無事務的,並且會一直傳播下去,無論在本類或者異類調用中,如A有事務,A調用B(無事務),B調用C(無事務),B和C同樣會具有A的事務。
無事務是不會向有事務傳播的。
事務與事務之間的調用,僅限於異類中,本類中的調用需要重新注入本類調用,參照例一,異類之間的調用又分爲7個級別(瞭解)(在spring boot中可以在@Transactional中的value來設置propagation的值來設置)

1、PROPAGATION_REQUIRED ,默認的spring事務傳播級別,使用該級別的特點是,如果上下文中已經存在事務,那麼就加入到事務中執行,如果當前上下文中不存在事務,則新建事務執行。所以這個級別通常能滿足處理大多數的業務場景。;
2、PROPAGATION_SUPPORTS:支持當前事務,若當前存在事務,則支持當前事務,若不存在,則以無事務的狀態執行;
3、PROPAGATION_MANDATORY:支持當前事務,若當前存在事務,則支持當前事務,若不存在,則拋出異常;
4、PROPAGATION_REQUIRES_NEW:新開事務執行,若當前存在事務,則掛起當前事務;
5:PROPAGATION_NOT_SUPPORTED:以無事務狀態執行,若存在事務則掛起;
6:PROPAGATION_NEVER:以非事務狀態執行,若存在事務則拋異常;
7、PROPAGATION_NESTED:當前存在事務,則嵌套一個新事務,當前不存在事務,則新開事務。
例一:

@Autowired
IService iService = null;

@Service(“service”)
public class ServiceImpl implements IService{

@Override
@Transactional(propagation=Propagation.REQUIRED)
public void a() { 
    this.b(); //①
    b();//②
    iService.b();③
}

@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void b() {  }		

}
可以看到a()和b()都是有事務的,但是在a中用①和②的調用方式是本類的調用方式,@Transactional(propagation = Propagation.REQUIRES_NEW) 不起作用,也就是說這時候 b 方法與 a 方法的事務定義是一樣的,只有③方式纔會使b的事務生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章