博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java连接访问Oracle--Connection.setSavepoint()方法使用
阅读量:7066 次
发布时间:2019-06-28

本文共 2816 字,大约阅读时间需要 9 分钟。

使用时有一个重要前提:你不能使用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(); } } }

 

转载于:https://www.cnblogs.com/zhaoyan001/p/6598839.html

你可能感兴趣的文章
ssm框架开发过程中遇到的一错误以及解决问题提示
查看>>
树的遍历
查看>>
微信公众号支付PHP-SDK的一个BUG
查看>>
网络 基于TCP协议socket编程
查看>>
现代软件工程讲义 目录
查看>>
Akka2使用探索6(Futures)——实现并发和异步
查看>>
【持续更新】jQuery 实用技巧
查看>>
大象也能起舞,Citrix X1计划让你对笔记本电脑say good bye
查看>>
Nginx 之常见报错问题解决
查看>>
linux 防爆破方法
查看>>
2、通过ipmitool工具修改IPMI的WEB密码
查看>>
云盘关闭,教你用蒲公英搭建私有云
查看>>
Spring Cloud 入门教程5、服务容错监控:Hystrix Dashboard
查看>>
很好的学习平台
查看>>
hibernate学习笔记3
查看>>
SQL Server 2005 日常运维检查操作手册
查看>>
利用jquery和jsonp来获取跨站数据,并实现cookie共享
查看>>
我的友情链接
查看>>
Linux的epoll模型
查看>>
使用X Manager远程CentOS 7服务器(XDMCP)
查看>>