下面用伪代码说明ingres数据库事务执行失败后全部回滚的实现过程 :
try
{
savepoint(sp); //如果此处 保存点所依赖的transaction_handle事务句柄由connect()连接数据库时获取,则创建保存点成功,可以用rollback(sp)实现全部回滚;如果此时事务句柄为空,或者不是下面要执行事务的事务句柄,则此处savepoint(sp)创建保存点失败,要实现全部回滚必须用rollback(NULL);
result=sql_query(A);//第一个查询语句A
if(result==failure)
throw 1;
savepoint(sp1); //第一个保存点sp1
result= sql_query(B);
if(result==failure) throw 2;
savepoint(sp2);
result= sql_query(C);
if(result==failure) throw 3;
//提交事务
commit();
}
catch(int i)
{
if(i==1)
{//全部回滚
rollback(NULL); //参数为空时就可以全部回滚 ,这是因为如果自动提交事务关闭之后,在commit之前的所有query语句都在一个事务中
}
else if(i==2)
{
//部分回滚
rollback(sp1); //回滚到sp1
}
}