jdbc java数据库连接 9)事务编程
1. 事务
基本概念:
事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。
事务ACID特性:
l 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
l 一致性(Consistency
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
l 隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
l 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
案例
需求: 张三给李四转账
设计: 账户表
技术:
|-- Connection
- void setAutoCommit(boolean autoCommit) ; 设置事务是否自动提交,如果设置为false,表示手动提交事务。
- void commit() (); 手动提交事务
- void rollback() ; 回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
- 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)事务编程的更多相关文章
- jdbc java数据库连接 11)中大文本类型的处理
1. Jdbc中大文本类型的处理 Oracle中大文本数据类型, Clob 长文本类型 (MySQL中不支持,使用的是text) Blob 二进制类型 MySQL数据库, Text ...
- jdbc java数据库连接 6)类路径读取——JdbcUtil的配置文件
之前的代码中,以下代码很多时候并不是固定的: private static String url = "jdbc:mysql://localhost:3306/day1029?useUnic ...
- jdbc java数据库连接 5)CallableStatement 接口
CallableStatement执行存储过程(也是预编译语言) 首先在sql中执行以下带有输入参数的代码: DELIMITER $ CREATE PROCEDURE pro_findById(IN ...
- jdbc java数据库连接 3)Statement接口之执行DDL和DML语句的简化
上一章的代码中,可以发现,jdbc执行DDL和DML有几个步骤都是一样的: 1)执行语句开始时,创建驱动注册对象.获取连接的数据库对象.创建Statement对象 // 创建驱动注册对象 Class. ...
- jdbc java数据库连接 2)jdbc接口核心的API
JDBC接口核心的API java.sql.* 和 javax.sql.*(java2.0以后更新的扩展) |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接 ...
- jdbc java数据库连接 1)jdbc入门
之前操作数据 1)通过mysql的客户端工具,登录数据库服务器 (mysql -u root -p 密码) 2)编写sql语句 3)发送sql语句到数据库服务器执行 什么是jdbc? 使用jav ...
- jdbc:java数据库连接
1.导jar包 四大参数: 1.加载驱动类:Class.forName("com.mysql.jdbc.Driver"); 2.url:jdbc:mysql://localhost ...
- jdbc java数据库连接 10)批处理
批处理 很多时候,需要批量执行sql语句! 需求:批量保存信息! 设计: AdminDao Public void save(List<Admin list){ // 目前用这种方式 ...
- jdbc java数据库连接 8)防止sql注入
回顾下之前jdbc的开发步骤: 1:建项目,引入数据库驱动包 2:加载驱动 Class.forName(..); 3:获取连接对象 4:创建执行sql语句的stmt对象; 写sql 5:执行sql ...
随机推荐
- 【分布式】Zookeeper使用--开源客户端
一.前言 上一篇博客已经介绍了如何使用Zookeeper提供的原生态Java API进行操作,本篇博文主要讲解如何通过开源客户端来进行操作. 二.ZkClient ZkClient是在Zookeepe ...
- CSS3属性 box-shadow 向框添加一个或多个阴影
CSS3属性 利用box-shadow制作网页页眉背景 box-shadow 浏览器支持 IE9+.Firefox 4.Chrome.Opera 以及 Safari 5.1.1 支持 box-shad ...
- 【中文分词】条件随机场CRF
之前介绍的MMEM存在着label bias问题,因此Lafferty et al. [1] 提出了CRF (Conditional Random Field). BTW:比较有意思的是,这篇文章的二 ...
- LinqToDB 源码分析——轻谈Linq查询
LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...
- 谈谈React那些小事
前言 说起React,那也是近一年多时间火起来的前端框架,其在Facebook的影响力和大力推广下,已然成为目前前端界的中流砥柱.在如今的前端框架界,React.Vue.Angular三分天下的时代已 ...
- Docker 基础 : 数据管理
用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,这必然涉及容器的数据管理操作.容器中管理数据主要有两种方式:数据 ...
- 解决VS调试时断点不会命中
断点调试是VS中的一大利器,有了它我们可以快速定位到代码的问题所在.在某些情况下会导致设置了断点后程序无法在断点处停下,下面分4种情况来解决断点不会命中的问题 百度经验:jingyan.baidu.c ...
- 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...
- Contents
Contents 占位 ---------------------------------- Python3中的字符串函数学习总结
- 【转】zigbee终端无法重连的问题解决
zigbee终端无法重连的问题解决 1.zigbee重连的原因 (1)zigbee由于各种原因的干扰导致信号太差而掉线. (2)协调器重启. 2.zigbee终端重连的处理 (1)zigbee掉线后会 ...