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 ...
随机推荐
- NET Core-学习笔记(二)
这里要分享的是接着上篇:NET Core-学习笔记(一)展开的继续学习core笔记,有不妥之处或者更好见解的地方希望各位朋友多多分享. 下面是本篇将要分享的学习步奏,对于刚学或者即将要学习的朋友做个相 ...
- 1、.NET平台概述
本学习主要参考Andrew Troelsen的C#与.NET4高级程序设计,这小节主要述说以下几个东西: 宏观上讨论一下.net相关的主题:程序集.CIL(Common Interme ...
- 软件工程里的UML序列图的概念和总结
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- 在DevExpress程序中使用内置的图标构建美观的界面元素
在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略 ...
- 一次页面从Jq到Vuejs+PartialView的迁徙
题外话 本篇分享不能帮助你入门vue,入门的文章也是无意义的,官方文档http://cn.vuejs.org/v2/guide/ 已经写的不能再清晰了.希望我们勇敢的主动地给自己创造实践的机会. 手里 ...
- Attribute操作的性能优化方式
Attribute是.NET平台上提供的一种元编程能力,可以通过标记的方式来修饰各种成员.无论是组件设计,语言之间互通,还是最普通的框架使 用,现在已经都离不开Attribute了.迫于Attribu ...
- java web学习总结(二十八) -------------------JSP中的JavaBean
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- spring mvc返回json字符串的方式
spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json 优点:不需要自己再处理 步骤一:在spring- ...
- java接口调用——webservice就是一个RPC而已
很多新手一听到接口就蒙逼,不知道接口是什么!其实接口就是RPC,通过远程访问别的程序提供的方法,然后获得该方法执行的接口,而不需要在本地执行该方法.就是本地方法调用的升级版而已,我明天会上一篇如何通过 ...