上机题目(初级)- 数据库事务(Java)

/*
 * 文件名:JDBCTestCase.java
 * 版权:Copyright 2006-2011 Huawei Tech. Co. Ltd. All Rights Reserved.
 * 描述: JDBCTestCase.java
 * 修改人:z00106659
 * 修改时间:2011-12-2
 * 修改内容:新增
 */
?
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Properties;
/**
 * 这个是一个简单演示JDBC操作的实例,对应胶片讲解的七个操作步骤, 使用JDK 自带的Derby数据库;
 *
 * Derby 是由IBM捐献给Apache的DB项目的一个纯Java数据库,两种使用模式, 一种是作为嵌入式数据库,另一种是作为网络数据库
 *
 * 此用例参考的Derby自带的Demo 在嵌入式 场景的使用有很详细的注释,在使用时减少安装数据库的麻烦;
 *
 *
 * @author z00106659
 * @version ONIP BME V300R001 2011-12-2
 * @since ONIP BME V300R001C00
 */
public class JDBCTestCase {
 /**
  * 驱动类名称
  */
 private String driver = "org.apache.derby.jdbc.EmbeddedDriver";
 /**
  * derby驱动协议头
  */
 private String protocol = "jdbc:derby:";
 public static void main(String[] args) {
  new JDBCTestCase().go();
  System.out.println("SimpleApp finished");
 }

 @SuppressWarnings("unchecked")
 void go() {
  /* load the desired JDBC driver */
  loadDriver();
  /*
   * We will be using Statement and PreparedStatement objects for
   * executing SQL. These objects, as well as Connections and ResultSets,
   * are resources that should be released explicitly after use, hence the
   * try-catch-finally pattern used below. We are storing the Statement
   * and Prepared statement object references in an array list for
   * convenience.
   */
  Connection conn = null;
  /*
   * This ArrayList usage may cause a warning when compiling this class
   * with a compiler for J2SE 5.0 or newer. We are not using generics
   * because we want the source to support J2SE 1.4.2 environments.
   */
  ArrayList statements = new ArrayList(); // list of Statements,
  // PreparedStatements
  PreparedStatement psInsert = null;
  PreparedStatement psUpdate = null;
  PreparedStatement psDelete = null;
  Statement s = null;
  ResultSet rs = null;
  try {
   Properties props = new Properties(); // connection properties
   // providing a user name and password is optional in the embedded
   // and derbyclient frameworks
   props.put("user", "user1");
   props.put("password", "user1");

   String dbName = "derbyDB"; // the name of the database

   conn = DriverManager.getConnection(protocol + dbName
     + ";create=true", props);
   System.out.println("Connected to and created database " + dbName);
   // We want to control transactions manually. Autocommit is on by
   // default in JDBC.
   /**
    * 支持事物
    */
   conn.setAutoCommit(false);
   /*
    * Creating a statement object that we can use for running various
    * SQL statements commands against the database.
    */
   s = conn.createStatement();
   statements.add(s);
   // We create a table...
   s.execute("create table location(num int, addr varchar(40))");
   System.out.println("Created table location");
   // and add a few rows...

   psInsert = conn
     .prepareStatement("insert into location values (?, ?)");
   statements.add(psInsert);
   psInsert.setInt(1, 2014);
   psInsert.setString(2, "zhangyaun");
   psInsert.executeUpdate();
   psInsert.setInt(1, 1956);
   psInsert.setString(2, "Webster St.");
   psInsert.executeUpdate();
   System.out.println("Inserted 1956 Webster");
   psInsert.setInt(1, 180);
   psInsert.setString(2, "Union St.");
   psInsert.executeUpdate();
   System.out.println("Inserted 1910 Union");
   conn.commit();//这里将操作提交
   // Let‘s update some rows as well...
   // parameter 1 and 3 are num (int), parameter 2 is addr (varchar)
   try {
    psDelete = conn
      .prepareStatement("delete from location where num=?");
    statements.add(psDelete);
    psDelete.setInt(1, 2014);
    psDelete.executeUpdate();
    conn.rollback();//这里回滚,可以将删除的2014 回滚回来
   } catch (RuntimeException e1) {
    e1.printStackTrace();
   }
   psUpdate = conn
     .prepareStatement("update location set num=?, addr=? where num=?");
   statements.add(psUpdate);
   psUpdate.setInt(1, 180);
   psUpdate.setString(2, "Grand Ave.");
   psUpdate.setInt(3, 1956);
   psUpdate.executeUpdate();
   System.out.println("Updated 1956 Webster to 180 Grand");
   conn.commit();
   try {
    psUpdate.setInt(1, 300);
    psUpdate.setString(2, "Lakeshore Ave.");
    psUpdate.setInt(3, 180);
    psUpdate.executeUpdate();
    System.out.println("Updated 180 Grand to 300 Lakeshore");
    conn.commit();
   } catch (RuntimeException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   /*
    * We select the rows and verify the results.
    */
   rs = s.executeQuery("SELECT num, addr FROM location ORDER BY num");
   while (rs.next()) {
    System.out.println(rs.getInt(1));
   }

   int number; // street number retrieved from the database
   boolean failure = false;

   if (!failure) {
    System.out.println("Verified the rows");
   }
   // delete the table
   s.execute("drop table location");
   System.out.println("Dropped table location");
   /*
    * We commit the transaction. Any changes will be persisted to the
    * database now.
    */
   conn.commit();
   System.out.println("Committed the transaction");

   try {
    // the shutdown=true attribute shuts down Derby
    DriverManager.getConnection("jdbc:derby:;shutdown=true");
    // To shut down a specific database only, but keep the
    // engine running (for example for connecting to other
    // databases), specify a database in the connection URL:
    // DriverManager.getConnection("jdbc:derby:" + dbName +
    // ";shutdown=true");
   } catch (SQLException se) {
    if (((se.getErrorCode() == 50000) && ("XJ015".equals(se
      .getSQLState())))) {
     // we got the expected exception
     System.out.println("Derby shut down normally");
     // Note that for single database shutdown, the expected
     // SQL state is "08006", and the error code is 45000.
    } else {
     // if the error code or SQLState is different, we have
     // an unexpected exception (shutdown failed)
     System.err.println("Derby did not shut down normally");
     printSQLException(se);
    }
   }
  } catch (SQLException sqle) {
   printSQLException(sqle);
  } finally {
   // release all open resources to avoid unnecessary memory usage
   // ResultSet
   try {
    if (rs != null) {
     rs.close();
     rs = null;
    }
   } catch (SQLException sqle) {
    printSQLException(sqle);
   }
   // Statements and PreparedStatements
   int i = 0;
   while (!statements.isEmpty()) {
    // PreparedStatement extend Statement
    Statement st = (Statement) statements.remove(i);
    try {
     if (st != null) {
      st.close();
      st = null;
     }
    } catch (SQLException sqle) {
     printSQLException(sqle);
    }
   }
   // Connection
   try {
    if (conn != null) {
     conn.close();
     conn = null;
    }
   } catch (SQLException sqle) {
    printSQLException(sqle);
   }
  }
 }
 /**
  * Reports a data verification failure to System.err with the given message.
  *
  * @param message
  *            A message describing what failed.
  */
 private void reportFailure(String message) {
  System.err.println("\nData verification failed:");
  System.err.println(‘\t‘ + message);
 }
 /**
  * Prints details of an SQLException chain to <code>System.err</code>.
  * Details included are SQL State, Error code, Exception message.
  *
  * @param e
  *            the SQLException from which to print details.
  */
 public static void printSQLException(SQLException e) {
  // Unwraps the entire exception chain to unveil the real cause of the
  // Exception.
  while (e != null) {
   System.err.println("\n----- SQLException -----");
   System.err.println("  SQL State:  " + e.getSQLState());
   System.err.println("  Error Code: " + e.getErrorCode());
   System.err.println("  Message:    " + e.getMessage());
   // for stack traces, refer to derby.log or uncomment this:
   // e.printStackTrace(System.err);
   e = e.getNextException();
  }
 }
 /**
  * Loads the appropriate JDBC driver for this environment/framework. For
  * example, if we are in an embedded environment, we load Derby‘s embedded
  * Driver, <code>org.apache.derby.jdbc.EmbeddedDriver</code>.
  */
 private void loadDriver() {

  try {
   Class.forName(driver).newInstance();
   System.out.println("Loaded the appropriate driver");
  } catch (ClassNotFoundException cnfe) {
   System.err.println("\nUnable to load the JDBC driver " + driver);
   System.err.println("Please check your CLASSPATH.");
   cnfe.printStackTrace(System.err);
  } catch (InstantiationException ie) {
   System.err.println("\nUnable to instantiate the JDBC driver "
     + driver);
   ie.printStackTrace(System.err);
  } catch (IllegalAccessException iae) {
   System.err.println("\nNot allowed to access the JDBC driver "
     + driver);
   iae.printStackTrace(System.err);
  }
 }
}

实现数据库事务

首先设置:

conn.setAutoCommit(false);

在commit()方法和rollback方法之间的操作会被回滚,我们做实验:

conn.commit();//这里将操作提交
   // Let‘s update some rows as well...
   // parameter 1 and 3 are num (int), parameter 2 is addr (varchar)
   try {
    psDelete = conn
      .prepareStatement("delete from location where num=?");
    statements.add(psDelete);
    psDelete.setInt(1, 2014);
    psDelete.executeUpdate();
    conn.rollback();//这里回滚,可以将删除的2014 回滚回来

这时删除的2014将回滚回来,回滚一般用于发生异常时,因此一般可以写在catch中,当删除不存在的编号时,回滚就起作用了。

时间: 2024-10-12 16:24:25

上机题目(初级)- 数据库事务(Java)的相关文章

[Java]Spring数据库事务基础知识

Spring虽然提供了灵活方便的事务管理功能,但这些功能都是基于底层数据库本身的事务处理机制工作的.要深入了解Spring的事务管理和配置,有必要先对数据库事务的基础知识进行学习. 何为数据库事务 "一荣俱荣,一损俱损"这句话很能体现事务的思想,很多复杂的事物要分步进行,但它们组成一个整体,要么整体生效,要么整体失效.这种思想反映到数据库上,就是多个SQL语句,要么所有执行成功,要么所有执行失败. 数据库事务有严格的定义,它必须同时满足 4 个特性:原子性(Atomic).一致性(Co

数据库事务练习-Java(新手)

数据库事务: 一个数据库事务通常包含了一个序列的对数据库的读/写操作.  为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法. 1 package JdbcDome; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import java.sql.SQLException; 6 7 public class JDBCDome3 { 8 publi

数据库事务并发了解一下呗

看了两天Java源码,有点懵.今天翻了一波面试的交流贴,唉,看看各大公司出的那些生怕你通过的面试题.真是觉得自己前途一片昏暗,片昏暗,昏暗,暗... but,习还是要学的,从面试题里看到有问数据库并发问题的,之前上课明明学过数据库原理的,但是看着题目大脑还是一片空白,片空白,空白,白...都是之间学习不总结的坑 so,来吧,再学一遍,同时梳理总结一下.好记性不如烂笔头头头头头! 数据库事务的四大特性(ACID) 原子性(Atomicity):是指一个事务中包含的所有操作,要么全做,要么全不做.

数据库事务的四大特性ACID

本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,所以事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响.为了实现原子性,需要通过日志:将所有对数据的更新操作都写入日志,如果一个事务中的一部分操作已经成功,但以后的操作,由于断电/系统崩溃/其它的软硬件错误而无法继续,则通过

数据库事务课上代码

1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent

[MySQL] 生产环境MySQL数据库事务一直在RUNNING

前言: 运营人员反映,有一单子提交卡住了,页面一直没有返回. 1,刚开始怀疑是应用服务器或者db压力过高hang住了,马上去check应用服务器以及db的负载,看起来都OK,蛮低的,应该不是DB性能问题. 2,最后去看下是否是表锁住了,查看到有2个事务一直RUNNING,没有结束., mysql> select * from INNODB_TRX\G;*************************** 1. row ***************************           

数据库事务之声明式事务

一.事务概述 1.在JavaEE企业级开发的应用领域,为了保证数据的完整性和一致性,必须引入数据库事务的概念,所以事务管理是企业级应用程序开发中必不可少的技术. 2.事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行. 3.事务的四个关键属性(ACID) 3.1.原子性(atomicity):"原子"的本意是"不可再分",事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可.事务的原子性要求事务中的所

数据库事务的四个基本特征以及事务的隔离级别

一.数据库事务的四个基本特征 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性.一致性.隔离性和持久性)属性,只有这样才能成为一个事务. 1.原子性(Atomicity):事务中包含的操作被看做一个逻辑单元,这个 逻辑单元中的操作要么全部成功,要么全部失败. 2.一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态. 拿转账来说,假设用户A和用户B两

简述数据库事务并发机制

摘要: 事务是最小的逻辑执行单元,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态.事务具有四个重要特性,即原子性(Atomicity).一致性(Consistency).隔离性 (Isolation)和持久性 (Durability).本文首先叙述了数据库中事务的本质及其四大特性(ACID)的内涵,然后重点介绍了事务隔离性的动机和内涵,并介绍了数据库为此所提供的事务隔离级别以及这些事务隔离级别能解决的事务并发问题.介于并发安全与并发效率的平衡,我们一般