① spring測試事務回滾,拋出RuntimeException
throw new RuntimeException("error!"); 按道理說這里運行到這里應該拋出異常。如果你建好了entry實體類。資料庫中表應該創建好了。 但是運行到這里throw new RuntimeException("error!"); 你save 數據不能進去就可以成功。你看看你資料庫表裡面有沒有數據。
你的junit 有沒有執行 service.add(new User()); 這個方法,如果你沒有執行它就不會拋出異常
public void add(User user) {
userDAO.save(user);
Log log=new Log();
log.setMsg("I love you!");
logDAO.save(log);
}
② 關於spring的事務與異常處理
記錄日誌後再拋出異常
protected<T>intexecuteUpdate(Stringsql,Object[]params,Class<T>clazz){
Loggerlog=Logger.getLogger(clazz);
intresult=0;
try{
result=jdbc.update(sql,params);
}catch(DataAccessExceptione){
log.error(clazz+e.getMessage(),e);
throwe;
}
returnresult;
}
把DAO的異常最後仍交由Spring-tx處理,這樣跟是否catch過就沒差了。
另外我還改了一下return的方式。
③ 求教,事務回滾失敗
其實第一,第二題的問題是一個,你只要搞清楚事務的統一性就知道答案了,比如,你現在有2個存儲過程,A,B .A是外部的,B是內部嵌套的。首先你要先確保B的過程是一個事務,A的過程也是一個事務。那麼在運行時,如果B有問題,報錯了,那麼B的事務會立即回滾,而且也會將這個錯誤傳給A,那麼A也回報錯回滾。你看看這個是sql的事務回滾設置當 SET XACT_ABORT 為 ON 時,如果 Transact-SQL 語句產生運行時錯誤,整個事務將終止並回滾。為 OFF 時,只回滾產生錯誤的 Transact-SQL 語句,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。我們默認的情況下是on
④ sql存儲過程中事務出現錯誤回滾,那麼在回滾之後的語句會執行嗎
會的來。
一般回滾操作都是寫自在異常處理,或是sql的最後。如果你的sql中出現錯誤 ,代碼會立即跳轉到錯誤處理代碼上執行,比如回滾,但緊接在錯誤行之後的代碼不會執行的。
如
1.update .....;
2.select ......;
3.when Exception
....rollback;
4.insert into .....
以上偽代碼,如果行1出錯,行2將不會執行,直接跳轉到行3,然後行4 也會執行。
⑤ sping管理事務,要手動回滾只能拋異常嗎
在Spring框架中對HIbernate事務處理,一般是在xml文件中配置。直接拋出,service也拋出,action獲取,就會回滾。。。。 一般都是也業務處處理事務,service中處理事務繼續拋出,action中獲取錯誤信息就可以了.....
⑥ 提交事務出現異常時,不是應該事務回滾嗎
oracle使用語句savepoint sp_begintran開啟顯式事務,鎖本身和事務是沒有關系的,只要是資料庫的操作都會產生鎖。處於事務中的SQL語句只有這個事務提交(commit)之後,事務中的SQL語句影響的表記錄上的鎖才會釋放。鎖常見有共享鎖(select語句產生)和排它鎖(DML語句產生),如果一個表上載入有共享鎖,還可以疊加共享鎖,但不能疊加排它鎖。如果一個表上載入有排他鎖,就什麼鎖都不能加了,也就是說如果DML語句佔用過多的時間,這些資料庫效率就不高,就需要優化,當然select語句性能低了也不行。
每個存儲過程可以不用顯式事務,它本身就為你開啟了一個隱式事務,如果需要開啟顯示事務,就通過savepoint sp_begintran開啟,無論是不是顯式還是隱式事務,你都得通過commit work提交事務,通過exception捕捉SQL語句異常,在異常發生時需要回滾事務(rollback work)。
⑦ 在子方法中catch異常,子事務為什麼回滾了
父方法里開啟事務,子方法裡面報出異常,子方法並沒有用try catch 捕獲,事務執行過save操作的model還是被保存進去了
在action上使用聲明式事務也有一樣的問題
⑧ 在資料庫中怎麼把異常拋到應用程序,就是事物回滾的時候要怎麼拋
大致格式如下:
try
{
AdoConnection.CreateInstance(__uuidof(Connection));//初始化Connection對象實例
AdoSet.CreateInstance(__uuidof(Recordset));//初始化Recordset對象實例
HRESULT hr=AdoConnection->Open(strConnect.GetBuffer(),"","",adOpenForwardOnly);
if (!SUCCEEDED(hr))
{
return false;
}
CString strSql=_T("");
strSql="SELECT * FROM 表名 WHERE 條件";
hr=AdoSet->Open(strSql.GetBuffer(),AdoConnection.GetInterfacePtr
(),adOpenForwardOnly,adLockReadOnly,adCmdText);
if (!SUCCEEDED(hr))
{
return false;
}
AdoSet->MoveFirst();
while(!AdoSet->adoEOF)
{
try
{
var=AdoFieldsPtr->Item["列名"]->Value;
if (var.vt != VT_NULL)
{
//用這個值
}
}
catch(...)//捕獲所有錯誤
{
//此處調用回滾.....
//....
return;
}
AdoSet->MoveNext();
}
}
catch(...)
{
AdoSet->Close();//關閉數據集
AdoConnection->Close();//關閉資料庫的連接
return false;
}
AdoSet->Close();//關閉數據集
AdoConnection->Close();//關閉資料庫的連接
⑨ java 什麼情況會事務回滾失敗
事務模塊中出現異常,比如主鍵沖突,非空,鎖表,資料庫連接中斷等等