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代码,账目表:

 CREATE TABLE transfer(
id INT PRIMARY KEY AUTO_INCREMENT ,
accName VARCHAR(20),
accmoney DOUBLE
)

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

 /**
* 这是个事务的操作类
*
* @author LZL
*
*/
public class Connection_false { // 设定全局变量
private static Connection conn;
private static PreparedStatement stsm; /**
* 这是个出错就回滚回整个事务的起始未知的例子
*/ @Test
public void trans1() { // 1:准备sql语言
String sql1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName='张三';";
String sql2 = "UPDATE transfer SET accmoney=accmoney+1000 WHERE accName='李四';"; try {
// 2:创建连接
conn = Jdbcutil.getConnection(); // 3:设定事物为手动开启
// void setAutoCommit(boolean autoCommit):将此连接的自动提交模式设置为给定状态
conn.setAutoCommit(false); // 4:执行sql
stsm = conn.prepareStatement(sql1);
stsm.executeUpdate(); stsm = conn.prepareStatement(sql2);
stsm.executeUpdate(); } catch (Exception e) {
// 4:若是上面的语句有任何一条出错,则回滚事务
try {
conn.rollback();
} catch (Exception e1) {
e1.printStackTrace();
}
} finally {
// 4:若是上面的语句(事务)都没错,则执行事务
// void commit():使所有上一次提交/回滚后进行的更改成为持久更改,并释放此 Connection
// 对象当前持有的所有数据库锁。
try {
conn.commit();
// 5:关闭连接
Jdbcutil.close(conn, stsm);
} catch (Exception e) {
e.printStackTrace();
} }
}

    

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

 @Test
public void test2() { // 创建保存点对象
Savepoint one = null; // 1:设定sql语句
// 第一次转账
String one1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName='张三';";
String one2 = "UPDATE transfer SET accmoney=accmoney+1000 WHERE accName='李四';";
// 第二次转账
String two1 = "UPDATE transfer SET accmoney=accmoney-1000 WHERE accName='张三';";
String two2 = "UPDATE tranfer SET accmoney=accmoney+1000 WHERE accName='李四';"; try {
// 2:创建连接
conn = Jdbcutil.getConnection(); // 3:设定事务为手动执行
conn.setAutoCommit(false); // 4:创建PreparedStatement对象。执行sql语句
// 执行第一笔转账
stsm = conn.prepareStatement(one1);
stsm.executeUpdate();
stsm = conn.prepareStatement(one2);
stsm.executeUpdate(); // 5:设定保存点
one = conn.setSavepoint("one"); // 执行第二笔转账
stsm = conn.prepareStatement(two1);
stsm.executeUpdate();
stsm = conn.prepareStatement(two2);
stsm.executeUpdate(); } catch (Exception e) {
// 6:若有语句出错,则回滚到保存点
try {
conn.rollback(one);
} catch (Exception e1) {
e1.printStackTrace();
}
e.printStackTrace();
} finally {
try {
// 7:若语句没有错误,则执行事务
conn.commit();
// 8:关闭连接
Jdbcutil.close(conn, stsm);
} catch (Exception e) {
e.printStackTrace();
}
} }

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

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

    1. Jdbc中大文本类型的处理 Oracle中大文本数据类型, Clob    长文本类型   (MySQL中不支持,使用的是text) Blob    二进制类型 MySQL数据库, Text   ...

  2. jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件

    之前的代码中,以下代码很多时候并不是固定的: private static String url = "jdbc:mysql://localhost:3306/day1029?useUnic ...

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

    CallableStatement执行存储过程(也是预编译语言) 首先在sql中执行以下带有输入参数的代码: DELIMITER $ CREATE PROCEDURE pro_findById(IN ...

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

    上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 // 创建驱动注册对象 Class. ...

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

    JDBC接口核心的API java.sql.*   和  javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...

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

      之前操作数据 1)通过mysql的客户端工具,登录数据库服务器  (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用jav ...

  7. jdbc:java数据库连接

    1.导jar包 四大参数: 1.加载驱动类:Class.forName("com.mysql.jdbc.Driver"); 2.url:jdbc:mysql://localhost ...

  8. jdbc java数据库连接 10)批处理

    批处理 很多时候,需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public  void  save(List<Admin list){    // 目前用这种方式 ...

  9. jdbc java数据库连接 8)防止sql注入

    回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象;  写sql 5:执行sql ...

随机推荐

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. 通过IEnumerable和IDisposable实现可暂停和取消的任务队列

    一般来说,软件中总会有一些长时间的操作,这类操作包括下载文件,转储数据库,或者处理复杂的运算. 一种处理做法是,在主界面上提示正在操作中,有进度条,其他部分不可用.这里带来很大的问题, 使用者不知道到 ...

  3. Android随笔之——Android时间、日期相关类和方法

    今天要讲的是Android里关于时间.日期相关类和方法.在Android中,跟时间.日期有关的类主要有Time.Calendar.Date三个类.而与日期格式化输出有关的DateFormat和Simp ...

  4. 第二章 consul的安装和启动

    安装环境: mac:64bit(查看mac位数:打开终端-->"uname -a") consul_0.6.4_darwin_amd64.zip和consul_0.6.4_w ...

  5. c 进程和系统调用

    这一篇博客讲解进程和系统调用相关的知识 有这样一个场景,我需要输入一串文字,然后把我输入的文字加上一个本地的时间戳 保存在一个文件中,可以初步理解为一个备忘录也行 #include <stdio ...

  6. C#中的委托解析

    谈及到C#的基本特性,“委托”是不得不去了解和深入分析的一个特性.对于大多数刚入门的程序员谈到“委托”时,都会想到“将方法作为方法的参数进行传递”,很多时候都只是知道简单的定义,主要是因为“委托”在理 ...

  7. ASP.NET Core 介绍

    原文:Introduction to ASP.NET Core 作者:Daniel Roth.Rick Anderson.Shaun Luttin 翻译:江振宇(Kerry Jiang) 校对:许登洋 ...

  8. Java正则速成秘籍(一)之招式篇

    导读 正则表达式是什么?有什么用? 正则表达式(Regular Expression)是一种文本规则,可以用来校验.查找.替换与规则匹配的文本. 又爱又恨的正则 正则表达式是一个强大的文本匹配工具,但 ...

  9. 单链表的C++实现(采用模板类)

    采用模板类实现的好处是,不用拘泥于特定的数据类型.就像活字印刷术,制定好模板,就可以批量印刷,比手抄要强多少倍! 此处不具体介绍泛型编程,还是着重叙述链表的定义和相关操作.  链表结构定义 定义单链表 ...

  10. C#对.zip 存档读取和写入

    Framework4.5支持 引用: System.IO.Compression.dll,System.IO.Compression.FileSystem.dll 提取压缩文件 ZipFile.Ext ...