工作中经常接触一些 Oracle 的存储过程,里面各种复杂的业务逻辑,在调用存储过程之前、之后的 Java 代码里还有各种业务逻辑操作。
存储过程里还可能有显式的 commit/rollback 等事务控制语句,容易让人对系统的事务管理产生困惑。
对于事务管理,可以从 Oracle 数据库和 JDBC 应用端两个角度来说。
对于 Oracle 数据库,只有碰到 commit 语句时才会提交事务,然后开启新事务;碰到 rollback,回滚当前事务的操作,再开启新事务。
应用端角度通过 JDBC 与数据库进行交互,JDBC 有两种事务管理模式:自动提交(默认)、手动管理。
对于自动提交模式,JDBC 向数据库发出一个 SQL 命令后,如果 SQL 执行成功,则发出 commit 提交事务,否则发出 rollback 回滚事务。
回到标题,一次存储过程调用是一个事务吗?如果存储过程里没有显式的 commit/rollback 语句,且 JDBC 是自动提交的,那么一次存储过程调用就是一个事务。