JDBC编程的事务处理
一、事务的基本概念
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据的时候,在数据库中就会产生多个用户同时存取同一数据的情况。若对并发操作不加控制,就可能会产生读取和存储不正确的数据,破坏数据的一致性。
而事务是并发控制的基本单位。所谓事务,即一个操作序列。这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。比如银行转账工作:从一个账户扣款,并使用另一个账户收款,这两个操作要么都执行,要么都不执行,因此应该把它们看作是一个事务。
事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。
对于编程人员来说,可以把数据库事务看作是一组sql语句,这组sql语句是一个逻辑工作单元,它们是不可分割的,它们的执行结果应该作为一个整体永久修改一个数据库的内容或者作为一个整体取消对数据库的修改。
二、事务的四个基本特征
1.原子性
原子性是指事务中包含的操作都被看作是一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。这也意味着事务中的所有元素作为一个整体提交或回滚。事务的所有元素是不可分割的,是一个完整的操作。
2.一致性
一致性是指事务开始之前和事务结束以后数据库都处于一致性状态,数据库的完整性约束没有被破坏。
3.隔离性
隔离性是指对数据库进行修改的多个事务是彼此隔离的。这说明事务必须是独立的,不应该以任何形式影响其他事务
4.持久性
持久性是指事务完成之后对于数据库的影响是永久的,该修改真实地修改了数据库,即使数据库出现故障也会一直保留。
三、与SQL相关的事务语句
开始事务:BEGIN TRANSACTION
提交事务:COMMIT TRANSATION
回滚事务:ROLLBACK TRANSATION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
package com.eduask.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/*将要测试的逻辑
保存一个用户Tom的基本信息和Tom的地址信息
分别通过两个java方法插入到用户表和地址表中
在插入地址表的时候人为造成一个异常
观察结果
*/
public class TransactionTest {
//创建一个getConnection()用来获取数据库的连接
public static Connection getConnection(){
Connection conn = null ;
try {
Class.forName( "com.mysql.jdbc.Driver" );
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/testdemo" , "root" , "root" );
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void insertUserData(Connection conn) throws SQLException{
String sql = "insert into tbl_user(id,name,password,email) "
+ "values(10,'Tom','123456','tom@gmail.com')" ;
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println( "向用户插入了 " + count + " 条记录" );
}
public static void insertAddressData(Connection conn) throws SQLException{
String sql = "insert into tbl_address(id,city,country,user_id) "
+ "values(1,'ShangHai','China','10')" ;
Statement st = conn.createStatement();
int count = st.executeUpdate(sql);
System.out.println( "向地址表中插入了 " + count + " 条记录" );
}
public static void main(String[] args) {
Connection conn = null ;
try {
conn = getConnection();
conn.setAutoCommit( false );
insertUserData(conn);
insertAddressData(conn);
conn.commit();
} catch (SQLException e) {
System.out.println( "=========捕获到SQL异常=========" );
e.printStackTrace();
try {
conn.rollback(); //回滚事务,保证数据库数据的一致性
System.out.println( "=========事务回滚成功=========" );
} catch (Exception e2) {
e2.printStackTrace();
}
} finally {
try {
if (conn != null ) {
conn.close();
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
}
}
|
本文转自yeleven 51CTO博客,原文链接:http://blog.51cto.com/11317783/1784316
JDBC编程的事务处理相关推荐
- 【Java】14 JDBC编程学习总结
文章目录 一.JDBC是什么? 二.为什么要使用JDBC? 三.DDL.DML.DCL分别代表什么 四.JDBC有三个操作步骤 实例代码 实例代码 实例代码 五.使用PreparedStatement ...
- jdbc和mysql做游戏排行榜_MySQL数据库与JDBC编程
欢迎关注公众号:xfxuezhang MySQL数据库与JDBC编程 JDBC (Java Database Connectivity) DDL(Data Definition Language,数据 ...
- JDBC编程的三个接口
Connection Connection接口用于表示应用程序和数据库系统之间的静态连接,提供了针对事务处理的方法以及创建执行sql语句和存储过程的方法,同时提供了一些基本的错误处理方法 create ...
- Java8学习之旅2---基于Lambda的JDBC编程
Java8的Lambda表达式确实是一个很好的特性.可是在哪些场合下使用.事实上还是须要细致考虑的.我们当然不能为了使用而使用,而是须要找到切实实用的场合.在JDBC编程中,比如查询语句,首先须要进行 ...
- jdbc preparestatement 执行多条语句_第二十一天JDBC编程
JDBC编程 JDBC是连接数据库和Java程序的桥梁,通过JDBC API可以方便地实现对各种主流数据库的操作.本篇将介绍一下如何使用JDBC操作数据库(以MySQL为例). 一.JDBC JDBC ...
- Mybatis解决jdbc编程的问题以及mybatis与hibernate的不同
Mybatis解决jdbc编程的问题: 1. 数据库连接创建.释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题. 解决:在SqlMapConfig.xml中配置数据连接池,使 ...
- 数据库编程连接mysql_使用JDBC编程-连接MySQL数据库
作者:李老师,吕老师 2019-09-23 准备工作: 1.首先安装MySQL5.5.30 64位:链接:https://pan.baidu.com/s/1H99PH-jRq ...
- 传统 JDBC 编程详解
提醒:编写JDBC程序前记得启动数据库服务器,并导入JDBC驱动jar包 JDBC编程6步曲: 第1步:注册mysql数据库驱动 第2步:通过DriverManager类获取数据库连接 第3步:通过C ...
- mysql5.1.40.jrp_1.原生态JDBC编程中的问题总结
### **1.1 环境** Java环境:jdk1.7.0\_72 Eclipse:indigo Mysql:5.1 ### **1.2 创建mysql数据库** 导入下面的脚本: ![](data ...
最新文章
- 【MySQL高级】查询缓存、合并表、分区表
- linux下软件如何防破裂,linux下管道破裂的處理
- 使用JFace Viewer延迟获取模型元素
- 第二篇:呈现内容_第四节:个性化自定义控件
- python分析数据走势_Python数据分析及可视化实例之个股走势预测(26)
- matlab 复数求模长,matlab计算带有复数的函数,最后求复数函数的模,结果里面却有...
- 字体系列之字体大小(CSS、HTML)
- 基于MapGuide的在线WebGIS站点介绍
- 只要一行代码,批量将Word转换为PDF!
- 游戏开场镜头拉近(Unity3D开发之四)
- c语言设计无纸化考试系统多少钱,无纸化考试系统解决方案
- C#上位机开发连接三菱PLC
- iOS/iPadOS中Office中文字体显示不正确的解决方法
- C# CultureInfo列表详细说明
- 专访|特赞CTO黄勇:微服务在互联网系统中如何实施?
- 线性代数的几何意义(一)——线性代数的意义
- 迅速学java——100条小知识点快速入门
- 人脸识别数据集-Glint360K
- O(n*logn)排序算法的总结
- java json escape_关于json数据中的多反斜杆转译--StringEscapeUtils.unescapeJava(踩过的坑)...