zoukankan      html  css  js  c++  java
  • 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

     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条是合理的。

     1 @Test
     2     public void demo(){
     3 //        1、获取连接
     4         Connection conn = null;
     5         PreparedStatement pstmt = null;
     6         Savepoint sp = null;
     7         try {
     8             conn = JdbcUtil.getConnection();
     9             conn.setAutoCommit(false);
    10             sp = conn.setSavepoint();
    11 //            获取pstmt对象
    12             String sql = "insert into user values(null,?,?)";
    13             pstmt = conn.prepareStatement(sql);
    14             for(int i = 1 ; i <= 10000 ; i++){
    15                 pstmt.setString(1, "name"+i);
    16                 pstmt.setString(2, "12345");
    17                 pstmt.executeUpdate();
    18                 
    19                 if(i == 27){
    20                     int index = 1/0;
    21                 }
    22 //                判断是否是500条,如果是500条,设置一个保存点
    23                 if( i%500 == 0){
    24                     sp = conn.setSavepoint();
    25                 }
    26             }
    27             conn.commit();
    28         } catch (Exception e) {
    29             try {
    30 //                会滚到指定的保存点
    31                 conn.rollback(sp);
    32                 //需要把回滚点的数据进行提交
    33                 conn.commit();
    34             } catch (SQLException e1) {
    35                 // TODO Auto-generated catch block
    36                 e1.printStackTrace();
    37             }
    38         }finally{
    39             JdbcUtil.release(conn, pstmt);
    40         }
    41     }

      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 操作

  • 相关阅读:
    hide the navigationBar and tabBar
    js
    CATranstion动画
    CASpringAnimation
    UIImageView动画
    打电话发短信
    页面滑动悬停在某个控件(两种做法)
    导航栏相关设置
    ASCII和16进制
    C++中,申请字符串数组可用new实现
  • 原文地址:https://www.cnblogs.com/Kubility123/p/7766880.html
Copyright © 2011-2022 走看看