一.   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

 void

setAutoCommit(boolean autoCommit)
          将此连接的自动提交模式设置为给定状态。

当我们传递的参数是 false的时候 相当于start transaction;  开启事务

当传递true的时候,自动提交。相当于一条sql语句一个事务。并且jdbc中。默认就是true。

开启事务:conn.setAutoCommit(false);

 void

rollback()
          取消在当前事务中进行的所有更改

相当于rollback;表示的是事务结束。并且更改无效。把数据恢复到开启事务时候的状态。

 void

commit()
          使所有上一次提交/回滚后进行的更改成为持久更改,

相当于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();  ----设置是的回滚点。

 Savepoint

setSavepoint()
          在当前事务中创建一个未命名的保存点 (savepoint),并返回表示它的新 Savepoint 对象。

Conn.rollback(sp);

 void

rollback(Savepoint savepoint)
          取消所有设置给定 Savepoint 对象之后进行的更改。

把数据回滚到,指定的回滚点的位置。

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)的更多相关文章

  1. Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用

    DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...

  2. JAVA企业级开发-jdbc入门(09)

    一. jdbc介绍 JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JD ...

  3. 数据库连接JDBC和数据库连接池C3P0自定义的java封装类

    数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...

  4. Java -- JDBC 学习--数据库连接池

    JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...

  5. Java操作数据库——手动实现数据库连接池

    Java操作数据库——手动实现数据库连接池 摘要:本文主要学习了如何手动实现一个数据库连接池,以及在这基础上的一些改进. 部分内容来自以下博客: https://blog.csdn.net/soonf ...

  6. Java EE开发课外事务管理平台

    Java EE开发课外事务管理平台 演示地址:https://ganquanzhong.top/edu 说明文档 一.系统需求 目前课外兴趣培训学校众多,完善,但是针对课外兴趣培训学校教务和人事管理信 ...

  7. Java EE 基本开发流程及数据库连接池 Druid

    一. 公司开发基本流程    a. 了解需求信息(比较模糊)        需求,不是别人告诉你的,是你自己挖掘出来的.        售前工程师(对行业知识了解):编程学不好,但懂点代码,对人的综合 ...

  8. 基于JDBC的数据库连接池技术研究与应用

    引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...

  9. JDBC【数据库连接池、DbUtils框架、分页】

    1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...

随机推荐

  1. 【学员管理系统】0x01 班级信息管理功能

    [学员管理系统]0x01 班级信息管理功能 写在前面 项目详细需求参见:Django项目之[学员管理系统] 视图函数: 我们把所有的处理请求相关的函数从 urls.py中拿出来,统一放在一个叫view ...

  2. 关联android-support-v4源码关联不上的解决办法

    在android项目中查看android-support-v4中的源码提示“Android Private Libraries which does not modified source attac ...

  3. SAP增强 和VA01相关增强点介绍

    -转 sap寻找用户出口方法 sap的用户出口总共有三代: 一.User EXIT 第一代的用户出口,它们include在SAP标准程序的源代码里,可以说他们是源代码的一部分,你改了这种出口就相当于改 ...

  4. LeetCode:分发饼干【455】

    LeetCode:分发饼干[455] 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的 ...

  5. drawable animation基础

    动画配置<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android: ...

  6. PAT 甲级 1007. Maximum Subsequence Sum (25) 【最大子串和】

    题目链接 https://www.patest.cn/contests/pat-a-practise/1007 思路 最大子列和 就是 一直往后加 如果 sum < 0 就重置为 0 然后每次 ...

  7. Maven2与maven1之间的区别

    1. 更快.更简单比起 Maven1 那不急不慢的运行速度,Maven2在速度上有了质的飞跃,甚至与Ant相比也毫不逊色(当然,下载不算).除此之外,"简化工作,使用业界公认的最佳实践&qu ...

  8. 安装NXNET

    cran <- getOption("repos") cran["dmlc"] <- "https://s3-us-west-2.amaz ...

  9. socket,获取html,webservice等,支持chunked,gzip,deflate

    1. [代码][C#]代码using System;using System.Collections.Generic;using System.Linq;using System.Net.Socket ...

  10. jQuery蓝色修边tab标签切换

    jQuery蓝色修边tab标签切换,jQuery,tab选项卡,标签切换,jQuery蓝色修边tab标签广告代码切换是一款非常简单实用tab选项卡切换效果,自己定义好相关的html标签即可,选项卡切换 ...