我认为我对如何使用Savepoints存在误解。也许有人可以为我清理它。我把我的例子呈现为我想做的事情,以及我所经历的事情。
我的应用正在执行某个程序。 在该过程(以及相关的DB操作)之前,我创建了一个保存点。 在此过程中,我启动了一个select更新, 这会产生许多锁:
lock1 - duration = transaction,class = row,type = intent row = big number
lock2 - duration = transaction,class = row,type = WriteNoPK row = big number
如果该java过程成功,则通过提交完成关联的DB事务。 但是,如果java过程失败,我还想回滚任何相关的数据库操作。 我一直试图通过:
conn.rollback(mySavepoint);
但是,这还没有释放由DB操作创建的表锁(上面)(我以为我刚刚通过conn.rollback(mySavepoint)回滚;)
我用两个数据库测试了这种行为:Sybase和Derby。
为什么会这样?
我真的需要在conn.rollback(mySavepoint)之后提交??? 这看起来有点违反直觉。
感谢您的帮助,
肖恩