我想我对如何使用 Savepoints 有误解。也许有人可以为我清除它。我将我的例子展示为我正在尝试做的事情,以及我所经历的事情。
我的应用程序正在执行某个程序。在该过程(和相关的数据库操作)之前,我创建了一个保存点。在该过程中,我启动了一个 select for update,它创建了许多锁:
lock1 - 持续时间=事务,类=行,类型=意向行=大数字
lock2 - 持续时间=事务,类=行,类型=WriteNoPK 行=大数字
如果该 java 过程成功,则关联的 DB 事务通过提交完成。但是,如果 java 过程失败,我还想回滚任何关联的数据库操作。我一直在尝试这样做:
conn.rollback(mySavepoint);
但是,这并没有释放由数据库操作创建的表锁(上面)(我以为我只是通过 conn.rollback(mySavepoint); 回滚)
我已经用两个数据库测试了这种行为:Sybase 和 Derby。
为什么会这样?
我真的需要在 conn.rollback(mySavepoint) 之后提交吗???这似乎有点违反直觉。