① 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 什么情况会事务回滚失败
事务模块中出现异常,比如主键冲突,非空,锁表,数据库连接中断等等