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 ...
随机推荐
- 【原创】记一次Project插件开发
一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...
- geotrellis使用(二十六)实现海量空间数据的搜索处理查看
目录 前言 前台实现 后台实现 总结 一.前言 看到这个题目有人肯定会说这有什么可写的,最简单的我只要用文件系统一个个查找.打开就可以实现,再高级一点我可以提取出所有数据的元数据,做个元 ...
- 你真的会玩SQL吗?实用函数方法汇总
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- GitHub更新自己Fork的项目
转自:http://www.tuicool.com/articles/MzMJre github上有个功能叫fork,可以将别人的工程复制到自己账号下.这个功能很方便,但其有一个缺点是:当源项目更新后 ...
- ASP.NET Core 中文文档 第三章 原理(13)管理应用程序状态
原文:Managing Application State 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:高嵩 在 ASP.NET Core 中,有多种途径可以对应用程序的状态进行 ...
- WebComponent魔法堂:深究Custom Element 之 标准构建
前言 通过<WebComponent魔法堂:深究Custom Element 之 面向痛点编程>,我们明白到其实Custom Element并不是什么新东西,我们甚至可以在IE5.5上定 ...
- Moon.Orm 常见查询实例
一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...
- No-args constructor for class X does not exist. Register an InstanceCreator with Gson for this type to fix this problem.
Gson解析JSON字符串时出现了下面的错误: No-args constructor for class X does not exist. Register an InstanceCreator ...
- Eclipse Maven Spring MyBatis 配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法
$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...