jdbc java数据库连接 9)事务编程

1. 事务

基本概念:

事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。

事务ACID特性:

  l 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  l 一致性(Consistency

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  l 隔离性(Isolation)

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  l 持久性(Durability)

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

案例

  需求: 张三给李四转账

  设计: 账户表

  技术

      |-- Connection

      1. void setAutoCommit(boolean autoCommit) ;  设置事务是否自动提交,如果设置为false,表示手动提交事务。
      2. void commit() ();   手动提交事务
      3. void rollback() ;   回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
      4. Savepoint setSavepoint(String name) :savepoint - 要回滚到的 Savepoint 对象

    1:sql代码,账目表:

1 CREATE TABLE transfer(
2     id INT PRIMARY KEY AUTO_INCREMENT ,
3     accName VARCHAR(20),
4     accmoney DOUBLE
5 )

    2:设定事务,若事务中有语句出现错误,则回滚到事务的初始化

 1 /**
 2  * 这是个事务的操作类
 3  *
 4  * @author LZL
 5  *
 6  */
 7 public class Connection_false {
 8
 9     // 设定全局变量
10     private static Connection conn;
11     private static PreparedStatement stsm;
12
13     /**
14      * 这是个出错就回滚回整个事务的起始未知的例子
15      */
16
17     @Test
18     public void trans1() {
19
20         // 1:准备sql语言
21         String sql1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName=‘张三‘;";
22         String sql2 = "UPDATE transfer SET accmoney=accmoney+1000 WHERE accName=‘李四‘;";
23
24         try {
25             // 2:创建连接
26             conn = Jdbcutil.getConnection();
27
28             // 3:设定事物为手动开启
29             // void setAutoCommit(boolean autoCommit):将此连接的自动提交模式设置为给定状态
30             conn.setAutoCommit(false);
31
32             // 4:执行sql
33             stsm = conn.prepareStatement(sql1);
34             stsm.executeUpdate();
35
36             stsm = conn.prepareStatement(sql2);
37             stsm.executeUpdate();
38
39         } catch (Exception e) {
40             // 4:若是上面的语句有任何一条出错,则回滚事务
41             try {
42                 conn.rollback();
43             } catch (Exception e1) {
44                 e1.printStackTrace();
45             }
46         } finally {
47             // 4:若是上面的语句(事务)都没错,则执行事务
48             // void commit():使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection
49             // 对象当前持有的所有数据库锁。
50             try {
51                 conn.commit();
52                 // 5:关闭连接
53                 Jdbcutil.close(conn, stsm);
54             } catch (Exception e) {
55                 e.printStackTrace();
56             }
57
58         }
59     }

    

    3:这是个回滚到事务中的指定位置的方法 例:如果我知道第一笔转账肯定成功,若出错就只会是第二笔出错,所以我会在第一和第二之间的位置设定个保存点:
      Savepoint setSavepoint(String name) 在当前事务中创建一个具有给定名称的保存点
      然后若是出错,则回滚到该保存点的位置,而之前的语句仍正常执行 void rollback(Savepoint savepoint):
       savepoint - 要回滚到的 Savepoint 对象

 1 @Test
 2     public void test2() {
 3
 4         // 创建保存点对象
 5         Savepoint one = null;
 6
 7         // 1:设定sql语句
 8         // 第一次转账
 9         String one1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName=‘张三‘;";
10         String one2 = "UPDATE transfer SET accmoney=accmoney+1000 WHERE accName=‘李四‘;";
11         // 第二次转账
12         String two1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName=‘张三‘;";
13         String two2 = "UPDATE tranfer SET accmoney=accmoney+1000 WHERE accName=‘李四‘;";
14
15         try {
16             // 2:创建连接
17             conn = Jdbcutil.getConnection();
18
19             // 3:设定事务为手动执行
20             conn.setAutoCommit(false);
21
22             // 4:创建PreparedStatement对象。执行sql语句
23             // 执行第一笔转账
24             stsm = conn.prepareStatement(one1);
25             stsm.executeUpdate();
26             stsm = conn.prepareStatement(one2);
27             stsm.executeUpdate();
28
29             // 5:设定保存点
30             one = conn.setSavepoint("one");
31
32             // 执行第二笔转账
33             stsm = conn.prepareStatement(two1);
34             stsm.executeUpdate();
35             stsm = conn.prepareStatement(two2);
36             stsm.executeUpdate();
37
38         } catch (Exception e) {
39             // 6:若有语句出错,则回滚到保存点
40             try {
41                 conn.rollback(one);
42             } catch (Exception e1) {
43                 e1.printStackTrace();
44             }
45             e.printStackTrace();
46         } finally {
47             try {
48                 // 7:若语句没有错误,则执行事务
49                 conn.commit();
50                 // 8:关闭连接
51                 Jdbcutil.close(conn, stsm);
52             } catch (Exception e) {
53                 e.printStackTrace();
54             }
55         }
56
57     }
时间: 2024-10-12 16:41:01

jdbc java数据库连接 9)事务编程的相关文章

JAVA学习笔记(五十)- JDBC Java数据库连接

JDBC操作步骤 /* * JDBC操作步骤 * */ public class Test01 { public static void main(String[] args) { try { //1.加载并注册驱动 Class.forName("com.mysql.jdbc.Driver"); //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); System.out.println("注册驱动成功!&qu

jdbc java数据库连接 1)jdbc入门

  之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用java代码(程序)发送sql语句的技术,就是jdbc技术!!!! 使用jdbc发送sql前提 登录数据库服务器(连接数据库服务器) 数据库的IP地址 端口 数据库用户名 密码 代码: 1 public class MySql_Demo1 { 2 3 //创建一个url 4 private static

jdbc java数据库连接 5)CallableStatement 接口

CallableStatement执行存储过程(也是预编译语言) 首先在sql中执行以下带有输入参数的代码: 1 DELIMITER $ 2 CREATE PROCEDURE pro_findById(IN sid INT) 3 BEGIN 4 SELECT * FROM person WHERE id = sid; 5 END $ 那么,这条语句的存储过程代码就是 CALL pro_findById (?); 使用CallableStatement来执行: 1 /** 2 带有输入参数的存储语

jdbc java数据库连接 2)jdbc接口核心的API

JDBC接口核心的API java.sql.*   和  javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口. |- connect(url, properties):  连接数据库的方法.   url: 连接数据库的URL URL语法: jdbc协议:数据库子协议://主机:端口/数据库 user: 数据库的用户名 password: 数据库用户密码 |- DriverManager类: 驱动管理器类

jdbc java数据库连接 11)中大文本类型的处理

1. Jdbc中大文本类型的处理 Oracle中大文本数据类型, Clob    长文本类型   (MySQL中不支持,使用的是text) Blob    二进制类型 MySQL数据库, Text    长文本类型 Blob    二进制类型 需求: jdbc中操作长文本数据. 设计: 测试表 编码: 保存大文本数据类型 读取大文本数据类型 保存二进制数据 读取二进制数据 MYSQL: 1 -- 测试大数据类型 2 CREATE TABLE test( 3 id INT PRIMARY KEY

jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化

上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 1 // 创建驱动注册对象 2 Class.forName("com.mysql.jdbc.Driver"); 3 4 // 获取连接的数据库对象 5 Connection conn = DriverManager.getConnection(url, user, 6 password); 7 8 // 创建Statemen

jdbc java数据库连接 3)Statement接口

|- Statement接口: 用于执行静态的sql语句 |- int executeUpdate(String sql)  : 执行静态的更新sql语句(DDL,DML) |- ResultSet executeQuery(String sql)  :执行的静态的查询sql语句(DQL) |-PreparedStatement接口(Statement接口的子类):用于执行预编译sql语句 |- int executeUpdate() : 执行预编译的更新sql语句(DDL,DML) |-Res

第77节:Java中的事务和数据库连接池和DBUtiles

前言 看哭你,字数:8803,承蒙关照,谢谢朋友点赞! 事务 Transaction事务,什么是事务,事务是包含一组操作,这组操作里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功就算失败,导致回滚就是指所有的数据都会回到最初的状态. 有事务,是为了保证逻辑一定要成功,如银行转账. 回顾一下 什么是jsp,jsp的三大指令. page: 定义当前页面的信息 include: 包含其他页面 taglib: 引入标签库 三大动作标签: <jsp:forward page="">

Java数据库连接——JDBC基础知识(操作数据库:增删改查)

一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivity) API,即Java数据库编程接口,是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库.比如建立数据库连接.执行SQL语句进行数据的存取操作. JDBC代表Java数据库连接. JDBC库中所包含的API任务通常与数据库使用: 连接到数据库 创