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. ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构

    系列目录 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当初设计的项目解决方案就是可伸缩可以拆离,可共享的项目解决方案.所以我们同时要添加App.Flow文件夹 ...

  2. 计算机程序的思维逻辑 (33) - Joda-Time

    Joda-Time上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Time,本节我们就来介绍Joda-Time.俗 ...

  3. 在C#里面给PPT添加注释

    平常开会或者做总结报告的时候我们通常都会用到PowerPoint演示文稿,我们可以在单个幻灯片或者全部幻灯片里面添加注释,这样观众可以从注释内容里面获取更多的相关信息. 有些朋友不清楚如何在幻灯片里面 ...

  4. Hibernate(3)——实例总结Hibernate对象的状态和ThreadLoacl封闭的session

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: Hibernate的内部执行过程(CRUD) 对象的状态及其转换图和例子 使用JUnit测试 使用getCur ...

  5. 基于tiny4412的Linux内核移植 ---- 調試方法

    作者信息 彭東林 郵箱: pengdonglin137@163.com 平臺 Linux-4.4.4 uboot使用的是友善自帶的(爲了支持uImage和設備樹做了稍許修改) 概述 這篇博客主要用於匯 ...

  6. SharePoint 2013 create workflow by SharePoint Designer 2013

    这篇文章主要基于上一篇http://www.cnblogs.com/qindy/p/6242714.html的基础上,create a sample workflow by SharePoint De ...

  7. Peter Hessler和他的中国三部曲(上)

    大约一年前,我从<英语铺子>栏目知道了Peter Hessler这位作家.主播分享了她的一些读后感和印象深刻的片段,当然主要是主播的声音太甜了,让我对这位美国作家留下了深刻的印象. Pet ...

  8. window下使用Redis Cluster部署Redis集群

    日常的项目很多时候都需要用到缓存.redis算是一个比较好的选择.一般情况下做一个主从就可以满足一些比较小的项目需要.在一些并发量比较大的项目可能就需要用到集群了,redis在Windows下做集群可 ...

  9. 在MongoDB的MapReduce上踩过的坑

    太久没动这里,目前人生处于一个新的开始.这次博客的内容很久前就想更新上来,但是一直没找到合适的时间点(哈哈,其实就是懒),主要内容集中在使用Mongodb时的一些隐蔽的MapReduce问题: 1.R ...

  10. MySQL大数据优化

    我们考虑的情况是在你的数据量很大的情况下,千万级别的数据量.不要当我们的请求响应时间已经让我无法忍受的时候,再来想起来优化,可能有点迟了.因为可能会丢失很多潜在的价值客户.所以,在我们当初设计表,或者 ...