前言

关于Java中JDBC的一些使用可以参见:

Java 中使用JDBC连接数据库例程与注意事项

在使用JDBC的使用, 如何进行事务的管理。直接看一下代码

示例代码

/**
 * @Title: JDBCTrans.java
 * @Package com.oscar999.trans
 * @Description:
 * @author XM
 * @date Feb 14, 2017 4:38:27 PM
 * @version V1.0
 */
package com.oscar999.trans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author
 *
 */
public class JDBCTrans {

	public JDBCTrans() {

	}

	/**
	 *
	 * @param sHostName
	 * @param sPortNumber
	 * @param sSid
	 * @param userName
	 * @param password
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException {
		Connection conn = null;
		String url = getOraclURL(sHostName, sPortNumber, sSid);
		conn = DriverManager.getConnection(url,userName,password);
		return conn;
	}

	/**
	 *
	 * @param conn
	 * @param sql
	 * @throws SQLException
	 */
	public void add(Connection conn, String sql) throws SQLException {
		Statement stmt = null;
		try {
			stmt = conn.createStatement();
			stmt.execute(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (stmt != null)
				stmt.close();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String sHostName = "";
		String sPortNumber = "";
		String sSid = "";
		String userName = "";
		String password = "";

		sHostName = "";
		sPortNumber = "";
		sSid = "";
		userName = "";
		password = "";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		JDBCTrans jdbcTrans = new JDBCTrans();
		Connection conn = null;
		try {
			conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password);
			conn.setAutoCommit(false);// can't insert, update

			//1. add SQL
			String addSQL = "insert into TEST_TABLE values('name1','value1')";
			jdbcTrans.add(conn,addSQL);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			/*if (conn != null)
			{
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}*/
		}

	}

	private String getOraclURL(String sHostName, String sPortNumber, String sSid) {
		String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid;
		return url;
	}

}

针对以上代码, 说明如下:

以上代码有几点说明的部分:
1. conn.setAutoCommit(false) 执行之后不提交事务。
对于Select没有影响, 但对于Insert和Update的话, 没有提交数据就不会被修改
2.  conn.close(); 关闭Connection的代码有被Mark掉, 是想呈现conn.setAutoCommit(false)的效果。
原因是在 Connection Close的时候会执行一次Commit.
而如果Connection是在应用服务器中使用连接池的话, Connection就不会被Close, 也就不会执行Commit.
3. setAutoCommit(false) 用法大多数是在要执行多条语句才提交。

所以针对以上第三点, 更接近实际的状况的代码如示例代码2

示例代码2

/**
 * @Title: JDBCTrans.java
 * @Package com.oscar999.trans
 * @Description:
 * @author XM
 * @date Feb 14, 2017 4:38:27 PM
 * @version V1.0
 */
package com.oscar999.trans;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @author
 *
 */
public class JDBCTrans {

	public JDBCTrans() {

	}

	/**
	 *
	 * @param sHostName
	 * @param sPortNumber
	 * @param sSid
	 * @param userName
	 * @param password
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection(String sHostName, String sPortNumber, String sSid, String userName, String password) throws SQLException {
		Connection conn = null;
		String url = getOraclURL(sHostName, sPortNumber, sSid);
		conn = DriverManager.getConnection(url, userName, password);
		return conn;
	}

	/**
	 *
	 * @param conn
	 * @param sql
	 * @throws SQLException
	 */
	public void add(Connection conn, String sql) throws SQLException {
		Statement stmt = null;
		try {
			stmt = conn.createStatement();
			stmt.execute(sql);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (stmt != null)
				stmt.close();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String sHostName = "";
		String sPortNumber = "";
		String sSid = "";
		String userName = "";
		String password = "";

		sHostName = "";
		sPortNumber = "";
		sSid = "";
		userName = "";
		password = "";

		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

		JDBCTrans jdbcTrans = new JDBCTrans();
		Connection conn = null;
		try {
			conn = jdbcTrans.getConnection(sHostName, sPortNumber, sSid, userName, password);
			conn.setAutoCommit(false);// can't insert, update

			// 1. add SQL 1
			String addSQL = "insert into TEST_TABLE values('name1','value1')";
			jdbcTrans.add(conn, addSQL);

			//2. add SQL 2
			addSQL = "insert into TEST_TABLE values('name2','value2')";
			jdbcTrans.add(conn, addSQL);

			conn.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			if(conn!=null){
	               try {
	            	   conn.rollback();
	               } catch (SQLException e1) {
	                   e1.printStackTrace();
	               }
	           }
			e.printStackTrace();
		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}

	}

	private String getOraclURL(String sHostName, String sPortNumber, String sSid) {
		String url = "jdbc:oracle:thin:@" + sHostName + ":" + sPortNumber + ":" + sSid;
		return url;
	}

}

这里需要说明的是 
 conn.rollback();

只要执行有异常,就要rollback , 这一步必不可少

如果没有在执行出现异常的时候进行回滚。如果在执行第一条语句之后出现异常,con既没有提交也没有回滚,表就会被锁住(如果oracle数据库就是行锁),而这个锁却没有机会释放。
可能在执行con.close()的时候会释放锁,但还是如果应用服务器使用了数据库连接池,连接不会被断开。

Java事务管理之JDBC的更多相关文章

  1. Java事务管理之Spring+Hibernate

    环境与版本 除了上一篇中的hibernate的相关lib 外 Java事务管理之Hibernate 还需要加入Spring的lib 包和如下的一些依赖包 org.aopallianceorg.aspe ...

  2. java事务管理

    一.什么是Java事务 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性(isol ...

  3. Java事务管理之Hibernate

    环境与版本 Hibernate 版本:Hibernate 4.2.2 (下载后的文件名为hibernate-release-4.2.2.Final.zip,解压目录hibernate-release- ...

  4. java事务管理(二)

    数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来. 下面是我收集到一些关于Spring事务的问题,希望能帮助大 ...

  5. JDBC、JTA、Spring的事务管理

    Java事务的类型有三种:JDBC事务.JTA(Java Transaction API)事务.容器事务. 事务就是对一系列的数据库操作(比如插入多条数据)进行统一的提交或回滚操作,如果插入成功,那么 ...

  6. 创建JDBC模板简化代码、JDBC应用的事务管理以及连接池的作用

    一.创建JDBC模板简化代码 一个简单的查询.要做这么一大堆事情,并且还要处理异常,我们不防来梳理一下: 1.获取connection  2.获取statement  3.获取resultset  4 ...

  7. 事务隔离级别与传播机制,spring+mybatis+atomikos实现分布式事务管理

    1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). 原子性(Atomicity):即事务是不可分割的最小工作单 ...

  8. Spring事务隔离级别与传播机制详解,spring+mybatis+atomikos实现分布式事务管理

    原创说明:本文为本人原创作品,绝非他处转载,转账请注明出处 1.事务的定义:事务是指多个操作单元组成的合集,多个单元操作是整体不可分割的,要么都操作不成功,要么都成功.其必须遵循四个原则(ACID). ...

  9. 【sping揭秘】22、事务管理

    有关事务的楔子 什么是事务??? 事务就是以可控的方式对数据资源进行访问的一组操作. 事务本身持有四个限定属性 原子性,一致性,隔离性,持久性 事务家族 Resource Manager  RM,负责 ...

随机推荐

  1. Java入门:基础算法之线性搜索

    本程序使用线性搜索算法从n个数中查找一个数. /* Program: 线性搜索示例 * @author: 理工云课堂 * Input: 元素个数,每个元素值,待查找数据的值 * Output:待查找数 ...

  2. 利用ansible来做kubernetes 1.10.3集群高可用的一键部署

    请读者务必保持环境一致 安装过程中需要下载所需系统包,请务必使所有节点连上互联网. 本次安装的集群节点信息 实验环境:VMware的虚拟机 IP地址 主机名 CPU 内存 192.168.77.133 ...

  3. Java基础-程序流程控制第一弹(分支结构/选择结构)

    Java基础-程序流程控制第一弹(分支结构/选择结构) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.if语句 1>.if语句的第一种格式 if(条件表达式){ 语句体: ...

  4. Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理

    副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...

  5. Android 6.0 7.0 8.0 一个简单的app内更新版本-okgo app版本更新

    登陆时splash初始页调用接口检查app版本.如有更新,使用okGo的文件下载,保存到指定位置,调用Android安装apk. <!-- Android 8.0 (Android O)为了针对 ...

  6. bzoj千题计划117:bzoj1026: [SCOI2009]windy数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1026 数位DP 如果前一位填的是0, 0是前导0,下一位可以随便填 0不是前导0,下一位不能填1 为 ...

  7. SQL语句(十五)视图

    视图 实际上是一个查询语句, 如果将子查询保存为视图, 就可以将子查询的结果当作数据表使用 从而来简化查询语句 引言 例1 查询参加"数据库技术"课程的考试的学生学号.姓名.班级. ...

  8. 如何创建一个https的站点(超简单) 以及 IIS7.5绑定Https域名

    1.申请免费1年的ssl证书(传送门:https://common-buy.aliyun.com/?spm=5176.2020520163.cas.29.N0xOPM&commodityCod ...

  9. petri网初步

    历史:Petri网的概念是德国的Carl Adam Petri早在1962年提出来的.他在他的论文里提出了一个新的信息流模型,这个模型基于系统各部分的异步并发的操作,并把各部分之间的关系用网状的图来描 ...

  10. 浅谈iOS与社交化网络

    CHENYILONG Blog 社交化网络 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong  ...