JDBC处理Transaction

 1 package com.ayang.jdbc;
 2
 3 import java.sql.*;
 4 /**
 5  * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提交。
 6  * 下边例子有三条update语句,假设第一条是updateA账户上的钱完了,自动提交,这时候出错了,B账户上的钱没update,这时候会出现数据不一致的问题。
 7  * 解决办法很简单,把它放在一个transtraction里去,要么两条同时完成,要么都不完成。
 8  * 任何一条DML语句会自动提交,因为在整个数据库连接里,有一个属性:AutoCommit();默认为值true,会自动提交。要想把某些语句放在一个transaction里,
 9  * 把AutoCommit(false);设为false,手动提交:最后执行conn.commit();然后恢复AutoCommit()为true.
10  * 如果catch到任何SQLException,首先进行conn.rollback();然后conn.setAutoCommit(true);确保万无一失。
11  */
12
13
14 public class TestTransaction {
15
16     public static void main(String[] args) {
17             Connection  conn  = null;
18             Statement  stmt =  null;
19             try {
20                 Class.forName("oracle.jdbc.driver.OracleDriver");
21                 conn  =  DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","root");
22
23                 conn.setAutoCommit(false);
24                 stmt = conn.createStatement();
25                 stmt.addBatch("insert into dept2 values(60,‘CPU‘,‘XUCHANG‘)");
26                 stmt.addBatch("insert into dept2 values(61,‘CPU‘,‘XUCHANG‘)");
27                 stmt.addBatch("insert into dept2 values(62,‘CPU‘,‘XUCHANG‘)");
28                 stmt.executeBatch();
29                 conn.commit();
30                 conn.setAutoCommit(true);
31
32
33             } catch (ClassNotFoundException e) {
34                 e.printStackTrace();
35             } catch (SQLException e) {
36                 e.printStackTrace();
37
38                 try {
39                     if(conn != null){
40                         conn.rollback();     //有异常时回滚。
41                         conn.setAutoCommit(true);
42
43                     }
44                 }catch (SQLException e1) {
45                     e1.printStackTrace();
46                 }finally{
47                     try{
48                         if(conn!=null){
49                             conn.close();
50                         }if(stmt!=null){
51                             stmt.close();
52                         }
53                     }catch (SQLException e1) {
54                         e1.printStackTrace();
55                     }
56                 }
57             }
58
59
60
61     }
62
63 }

自动提交效果对比,能插入前两条记录(第三条sql语句缺失into)第三条sql不会执行。

//conn.setAutoCommit(false);

stmt = conn.createStatement();

stmt.addBatch("insert into dept2 values(60,‘CPU‘,‘XUCHANG‘)");

stmt.addBatch("insert into dept2 values(61,‘CPU‘,‘XUCHANG‘)");

stmt.addBatch("insert  dept2 values(62,‘CPU‘,‘XUCHANG‘)");

stmt.executeBatch();

conn.commit();

//conn.setAutoCommit(true);

时间: 2024-11-09 10:22:58

JDBC处理Transaction的相关文章

给出一个jdbc的transaction例子?

7.jdbc的transaction例子:(视频下载) (全部书籍)import java.sql.*; public class MySQlTransaction1 { public static void main(String[] args) throws SQLException {/*in my sql: create table Accounts(                ID int(4) not null,                NAME varchar(15), 

JDBC中Transaction的实现

Transaction(交易)问题指的是在银行交易过程中,有两方以上的数据库要变动,这时候要求两方数据库同时做出改变. mysql中默认commit方式为自动提交,因此实现这个问题的 第一步是调用Connection中的setAutoCommit(false)方法,将提交方式改为手动提交: 然后使用addBatch()方法,如果一方数据库执行出现错误,调用用callBack()方法,确保多方数据库同时变动 例: 1 import java.sql.*; 2 3 public class Test

spring+jdbc+template+transaction实现

使用spring和jdbc模板事务实现 1.创建实体类: Role package com.wbg.sjt.entity; public class Role { private int id; private String roleName; private String note; @Override public String toString() { return "Role{" + "id=" + id + ", roleName='"

Hibernate Session & Transaction详解

Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持久化操作核心API, 注意这里的Session的含义,它与传统意思上web层的HttpSession并没有关系,Hibernate Session之与Hibernate,相当于JDBC Connection相对与JDBC. Session对象是有生命周期的,它以Transaction对象的事务开始和结束边界

Springframework 1 - Overview

*** The following words, some are culled from Official Spring Framework Reference and some are summarized from my working practice. Introduction The Spring Framework is a Java platform that provides comprehensive infrastructure support for developing

c3p0数据库连接池使用小结

一.C3P0介绍 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有hibernate,spring等.c3p0的出现,是为了大大提高应用程序和数据库之间访问效率的. 它的特性: 1.编码的简单易用 2.连接的复用 3.连接的管理 二.使用方法 1.下载最新C3PO包文件,下载地址:https://sourceforge.NET/projects/c3p0/files/ 2.将上面的包文件中lib下的c3p0-xxx

atomikos的Jta配置

配置说明见: http://www.atomikos.com/Documentation/JtaProperties atomikos的一些配置,文档中说明的比较清楚,有两个属性配置不太明确:com.atomikos.icatch.max_timeout.com.atomikos.icatch.default_jta_timeout都是关于事务超时的,验证了一下第一个配置有效的,当事务运行时间超过该时间配置时,会抛错.com.atomikos.jdbc.AtomikosSQLException:

使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方案

本文提供了对c3p0与DBCP连接池连接MySql数据库时, 8小时内无请求自动断开连接的解决方案.首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方案. 项目环境: Java Web项目框架为Spring MVC+JPA,使用c3p0连接池,发布环境为Tomcat 7 错误描述: 项目运行一段时间(大概几个小时)之后访问时会出现第一次访问报错,再次访问正常的现象,且多次出现此问题. 报错日志: [plain] view plaincopy org.spr

Spring事务管理--多个ORM框架在使用时的情况分析

公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,他们是