spring事務失效的幾種場景

2021-10-07 20:46:27 字數 1486 閱讀 6220

不廢話

以 mysql 為例,其 myisam 引擎是不支援事務操作的,innodb 才是支援事務的引擎,一般要支援事務都會使用 innodb。
根據 mysql 的官方文件:

mysql 的官方文件

從 mysql 5.5.5 開始的預設儲存引擎是:innodb,之前預設的都是:myisam,所以這點要值得注意,底層引擎不支援事務再怎麼搞都是白搭。

如下面例子:

// @service

public class orderserviceimpl implements orderservice

}

如果此時把 @service 註解注釋掉,這個類就不會被載入成乙個 bean,那這個類就不會被 spring 管理了,事務自然就失效了。

大概意思就是 @transactional 只能用於 public 的方法上,否則事務不會生效,如果要用在非 public 方法上,可以開啟 aspectj **模式。

@service

public class orderserviceimpl implements orderservice

@transactional

public void updateorder(order order)

}

發生了自身呼叫,就調該類自己的方法,而沒有經過 spring 的**類,預設只有在外部呼叫事務才會生效,this是乙個實際的物件,事務呼叫者為動態**物件才生效

@service

public class orderserviceimpl implements orderservice catch

}}

把異常吃了,然後又不丟擲來,事務怎麼回滾吧!

@service

public class orderserviceimpl implements orderservice catch

}}

這樣事務也是不生效的,因為預設回滾的是:runtimeexception,如果你想觸發其他異常的回滾,需要在註解上配置一下,如:

@transactional(rollbackfor = exception.class)

這個配置僅限於 throwable 異常類及其子類。

@resource

private inoworkingservice noworkingservice;

@test

void noworkmodel1()

@override

public void noworkmodel1()

@transactional

public void noworkmodel1_1()

由於業務開發中通常使用介面作為呼叫物件,如果註解標記在了介面方法呼叫的方法中,則事務無效

spring事務失效

遇到的問題 前端時間我在做乙個父子事務巢狀的時候,出現了子事務失效。在同類的子事務上加事務註解一直都不能建立事務,後來發現是子事務失效了。下面總結一下事務失效情況和解決經驗 事務失效有如下幾種情況 沒有transaction註解 事務沒有丟擲runtimeexception異常到方法上 方法內丟擲r...

Spring 事務失效

1.丟擲檢查異常導致事務不能正確回滾 service public class service1 2.業務方法內自己 try catch 異常導致事務不能正確回滾 service public class service2 catch filenotfoundexception e 解法2 手動設定...

索引失效的幾種場景

在資料庫sql優化中,百分之80 的問題sql都可以通過索引來解決,但是有時候我們也會碰到一種情況,明明索引都有,為什麼mysql沒有選擇走索引而是走了全表掃瞄呢?近期就碰到乙個案例,同大家分析乙個當時的解決思路以及對索引失效的幾種情況總結一下 在乙個風和麗日的下午,突然一條高亮的釘釘資訊抖動在為眼...