设为首页 收藏本站
查看: 617|回复: 0

[经验分享] Java连接访问Oracle--Connection.setSavepoint()方法使用

[复制链接]
YunVN网友  发表于 2016-8-13 06:26:21 |阅读模式
  使用时有一个重要前提:你不能使用oracle的classes12.jar,需要把oracle的jdbc驱动替换成ojdbc14.jar,否则savepoint()功能不能使用(出现“abstract方法尚未被oracle的jdbc驱动实现的错误”)。
  JDBC 3.0的savepoints可以让你细化地控制一个数据库事务。
  JDBC 3.0的一个最酷的新功能就是它可以在一个事务中创建并运用savepoints。
  Savepoints——长期以来是SQL的一个 功能——通过标记事务可以回滚到的中间步骤,就可以让你细化地控制一个JDBC数据库事务。那么你为什么要这么做呢?我们来看一个典型的订票问题。Ivana女士想从北京到太原度假,然后再回来。她订的票是从北京到太原,然后再返回。下面就是整个事务的步骤:
  1. 开始事务
2. 订从北京到太原的航班
3. 订从太原到北京的返航
4. 提交事务
5. 如果出现异常或错误,回滚事务
但在这个例子中,如果在第五步,票售完了,整个行程就得取消,回滚使数据库回复到第一步开始执行前的状态。 然而,不管怎样Ivana可能还是需要一些票的,因为她可以在返回时坐另外的航线。你可以用JDBC 3.0的savepoints来帮助Ivana女 士,整个事务如下:
1. 开始事务
2. 订从北京到太原的航班
3. 建立savepoint
4. 订从太原到北京的返航
5. 当出现异常或错误时,如果设了savepoint,回滚事务到步骤4中的savepoint
6. 提交事务 

  简单地说,一个savepoint就是代表一个特殊时间点上的一个事务,并对事务中SQL语句的一个子集完成的工作提供细化的控制。运用 savepoint,你就不会回滚到一个事务的起始状态,而是回滚到savepoint。你可以在一个单一的事务中运用多个savepoints,通过明 确调用Connection.releaseSavepoint (savepoint) 方法,或者通过提交事务、回滚整个事务来释放 (release)savepoints。一旦一个savepoint被释放了,试图回滚到它就会抛出一个SQLException异常。
要在你的Java代码中运用savepoints,你必须运用JDBC 3.0,这就是说:
· 你必须运用JDK 1.4,因为它是一个核心API。
· 你的JDBC驱动程序必须是JDBC 3.0兼容的。你可以在http://industry.java.sun.com/products/jdbc/drivers的Sun JDBC驱动程序数据库中找到JDBC驱动程序列表。


public class JdbcTestSavePoint {
public static void executeJdbc(boolean onlyHuiPiao) throws SQLException {
Connection conn = null;
Statement ptmt = null;
Savepoint txpoint = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@10.1.252.80:1521:newngboss", "sr", "sr");
conn.setAutoCommit(false);
try {
ptmt = conn.createStatement();
ptmt.execute("insert into input_component_template(id,name) values(-110,'121000')");// 回的票,必须有
txpoint = conn.setSavepoint();
ptmt.execute("insert into input_component_template(id,name) values(-111,'121111')");// 返程票,不必须
if (onlyHuiPiao && txpoint != null) {// 只要回的票
conn.rollback(txpoint);
}
conn.commit();
} catch (Exception e) {//异常处理
e.printStackTrace();
if (txpoint != null) {
conn.rollback(txpoint);
conn.commit();
} else {
conn.rollback();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (ptmt != null)
ptmt.close();
if (conn != null)
conn.close();
}
}
public static void main(String[] args) {
try {
executeJdbc(true);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
  


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-256901-1-1.html 上篇帖子: OracleDBA之路之Oracle体系结构介绍(二) 下篇帖子: 《Oracle编程艺术》学习笔记(15)-事务原子性
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表