JAVA企业级开发-jdbc事务,数据库连接池(10)
一. JDBC事务
事务:
问题1、什么是事务
问题2、java中(jdbc)如何控制事务
1. 事务—重点
指的的逻辑上的一组(一组sql,insert update ,delete)操作,组成这组操作的各个单元(各个sql),要不全部成功,要么全部失败。
举例: 转账 a 给b 转账 100 a原来有1000 b原来也有1000
account 是一个表名 表示的 账务表,里面有人的信息,和人的金额。
update account set money=money-100 where name = a;
update account set money =money+100 where name=b;
没有事务的情况下
update account set money=money-100 where name = a;
======异常,后面的sql不会执行。
update account set money =money+100 where name=b;
发生之后,数据库中的记录;a 900 b 1000
有事务情况
1、开启事务
update account set money=money-100 where name = a; a=900
======异常,后面的sql不会执行。
update account set money =money+100 where name=b;
2、事务的回滚;如果发生异常;不会把更改的内容进行更改 a=1000
最后数据库里面的数据 a1000 b1000
1、开启事务
update account set money=money-100 where name = a; a=900
update account set money =money+100 where name=b; b=1100
2、提交事务:把更改数据进行生效。真正的更改数据库表中的内容
a 900 b1100
2. mysql中的事务管理
----mysql中,默认事务是自动提交的。 相当于一条sql语句就是一个事务。只要执行sql,就会去更改数据库里面的内容
start transaction ---- 开启一个事务。以后的sql都在一个事务中。更改的内容不会自动提交。
rollback ---事务的回滚—同时失败的情况。--事务结束,并且全部失败,数据回复到开始之前的状态
commit ----------事务的提交----同时成功---事务结束。全部成功。
----账务信息
create table account(
name varchar(10),
money double
);
insert into account(name,money) values('a',1000);
insert into account(name,money) values('b',1000);
去做a给b转100块。
a、事务的回滚
b.、事务的提交
3. jdbc中事务管理---重点
Connection
|
|
当我们传递的参数是 false的时候 相当于start transaction; 开启事务
当传递true的时候,自动提交。相当于一条sql语句一个事务。并且jdbc中。默认就是true。
开启事务:conn.setAutoCommit(false);
|
|
相当于rollback;表示的是事务结束。并且更改无效。把数据恢复到开启事务时候的状态。
|
|
相当于commit 。表示事务的结束。并且数据更改有效
一旦数据commit之后,永久更改了。不能回滚了。
rolllack 要放入到catch中。并且抓取异常的时候,尽可能抓取最大的(不是绝对)。
没有人为的控制事务的时候,情况
手动控制事务:
a. 事务回滚点
案例:
一次性去执行多条(10000)sql语句的时候。一出戏异常,10000条全部回滚。
每100条是合理的。
insert into dept(id)
insert into employee()
100,到100的时候,财务部,所有的员工都加载进去。
101—200 加入java 研发部。
JDBC提供事务回滚点接口 Savepoint, 如果在事务中进行savepoint设置,可以在事务回滚时,回滚到指定回滚点
API:
Savepoint sp = conn.setSavepoint(); ----设置是的回滚点。
|
Conn.rollback(sp);
|
把数据回滚到,指定的回滚点的位置。
Conn.commit(); //回滚后必须要提交
案例:向数据库发送10000条数据,每1000条是合理的。
- @Test
- public void demo(){
- // 1、获取连接
- Connection conn = null;
- PreparedStatement pstmt = null;
- Savepoint sp = null;
- try {
- conn = JdbcUtil.getConnection();
- conn.setAutoCommit(false);
- sp = conn.setSavepoint();
- // 获取pstmt对象
- String sql = "insert into user values(null,?,?)";
- pstmt = conn.prepareStatement(sql);
- for(int i = 1 ; i <= 10000 ; i++){
- pstmt.setString(1, "name"+i);
- pstmt.setString(2, "12345");
- pstmt.executeUpdate();
- if(i == 27){
- int index = 1/0;
- }
- // 判断是否是500条,如果是500条,设置一个保存点
- if( i%500 == 0){
- sp = conn.setSavepoint();
- }
- }
- conn.commit();
- } catch (Exception e) {
- try {
- // 会滚到指定的保存点
- conn.rollback(sp);
- //需要把回滚点的数据进行提交
- conn.commit();
- } catch (SQLException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- }finally{
- JdbcUtil.release(conn, pstmt);
- }
- }
4、 事务的特性 ACID --- 重点
事务:一组操作。--要么都成功 要么都失败
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位(最小的一个整体),事务中的操作要么都发生,要么都不发生。
一组操作时一个整体。不能分割。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
一致性和原子性相关。只有都成功或者,都失败(原子性) ,就可以保证事务的一致性。
举例:a,b转账 a 1000 b 1000
a -100
b+100
a+b =2000
前提: 公司,部门和人员的信息,
当前情况 每个部门有有人
解散一个部门
1、删除员工
2、删除部门---失败了
有一些部门下面没有员工了。
隔离性(Isolation)
事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。
多个事务是独立存在的。多个事物不能够相互干扰。
a –b---事务A
c-d---事务B
如果A失败了。不能够影响B
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
转账
a 1000
b 1000
a-b转账 100
a 900
b 1100 ;数据库的最终数据库
接下来—数据库异常;数据库错误。。。
后续的操作,对之前的事务的内容,不能有影响。
start …
commit;
rollback;---不会回滚;
4.1 事务的隔离级别
如果不考虑事务的隔离性,将会产生以下问题:
由数据事务的并发造成的问题。
1、脏读,---最严重的事情。
2、不可重复读
3、幻读(虚读)
一个事务读取了另外一个事务没有的提交的数据。非常严重。尽可能去避免掉脏读
一个事务读取另外一个提交过的数据。造成另外一个事务,多次读取的内容不一致,数据的内容的改变。 update
一个事务,读取了另外一个事务提交了的数据。-----同一行数据。
数据的改变。---update
虚读:一个事务读取另外一个事务已经提交的数据。但是这里面强调的数据数目的改变。insert,delete。
一个事务读取另外一个事务已经提交过的数据。 强调的是条目数的改变insert,delete
1、开始统计 100
用户下单 提交
2、查询 101
虚读和不可重复读
不可重复度:读取同一行的数据,多次读取的结果不一致。 update操作引起
幻读:读取的行的数目不同, insert , delete 操作
JAVA企业级开发-jdbc事务,数据库连接池(10)的更多相关文章
- Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用
DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...
- JAVA企业级开发-jdbc入门(09)
一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- Java -- JDBC 学习--数据库连接池
JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...
- Java操作数据库——手动实现数据库连接池
Java操作数据库——手动实现数据库连接池 摘要:本文主要学习了如何手动实现一个数据库连接池,以及在这基础上的一些改进. 部分内容来自以下博客: https://blog.csdn.net/soonf ...
- Java EE开发课外事务管理平台
Java EE开发课外事务管理平台 演示地址:https://ganquanzhong.top/edu 说明文档 一.系统需求 目前课外兴趣培训学校众多,完善,但是针对课外兴趣培训学校教务和人事管理信 ...
- Java EE 基本开发流程及数据库连接池 Druid
一. 公司开发基本流程 a. 了解需求信息(比较模糊) 需求,不是别人告诉你的,是你自己挖掘出来的. 售前工程师(对行业知识了解):编程学不好,但懂点代码,对人的综合 ...
- 基于JDBC的数据库连接池技术研究与应用
引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...
- JDBC【数据库连接池、DbUtils框架、分页】
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...
随机推荐
- Chernoff-Hoeffding inequality -- Chernoff bounds, and some applications
https://www.cs.utah.edu/~jeffp/teaching/cs5955/L3-Chern-Hoeff.pdf [大数据-通过随机过程降维 ] When dealing with ...
- [容易]在O(1)时间复杂度删除链表节点
题目来源:http://www.lintcode.com/zh-cn/problem/delete-node-in-the-middle-of-singly-linked-list/
- eslint 配合 git (husky)
为了保证每次提交的 git 代码是正确的,为此我们可以使用 eslint 配合 git hook, 在进行git commit 的时候验证eslint规范 如果 eslint 验证不通过,则不能提交. ...
- 怎么样写一个能告诉你npm包名字是否被占用的工具
事情是这样的: 因为我经常会写一些npm包,但是有时候我写完一个包,npm publish 的时候却被提示说包名字被占用了,要不就改名字,要不就加scope,很无奈.npm 命令行可以通过 npm v ...
- Windows Server 2008 MS Office 操作 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))。
Make sure that you have Office runtime installed on the server. If you are using Windows Server 2008 ...
- Codeforces Round #461 (Div. 2) B C D
题目链接:http://codeforces.com/contest/922 B. Magic Forest time limit per test 1 second memory limit per ...
- Android SDK Manager更新问题
1.如果是windows7,那么"开始-->所有程序-->Android SDK Tools-->右键SDK Manager-->以管理员身份运行(A)"2 ...
- BZOJ 3016 [Usaco2012 Nov]Clumsy Cows:贪心
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3016 题意: 给你一个括号序列,问你至少修改多少个括号,才能使这个括号序列合法. 题解: ...
- 前端多媒体(1)——获取摄像头&麦克风
捕获视频/音频 PPT地址 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点. 依靠 WebR ...
- selenium 经常用到的API
一.webdriver 属性及方法: 1.获取当前页面的 url driver.current_url 2 .获取窗口相关信息 get_window_position() 返回窗口x,y坐标 get_ ...