zoukankan      html  css  js  c++  java
  • JDBC基础学习(四)—数据库事务

    一、事务基本认识

    1.事务的概述

         为了保证数据库中数据的一致性,数据的操作应当是离散的成组的逻辑单元。当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应当全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

         事务的操作: 先定义开始一个事务,然后对数据做修改操作,这时如果提交(commit),这些数据就永久的保存下来,如果回退(rollback),数据库管理系统就放弃所有的修改而回到开始事务的状态。

    2.事务的属性

    (1)原子性(Atmicity)

         原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生。

    (2)一致性(Consistency)

         事务必须使数据库从一个一致性状态变换到另外一个一致性的状态。

    (3)隔离性(Isolation)

        事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    (4)持久性(Durability)

         持久性是一个事务一旦被提交,它对数据库中的数据改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

    二、事务在JDBC中的操作

         (1)如果多个操作,每个操作使用的是自己的单独连接,则无法保证事务。

         (2)使用步骤:

             A: 事务开始前,开始事务,即取消自动提交。con.setAutoCommit(false);

             B: 如果事务的操作都成功,就提交事务。con.commit();

             C: 如果出现异常,在Catch块中回滚事务。con.rollback();

    	/*
    	 * 事务
    	 * 1.如果多个操作,每个操作使用的是自己的单独连接,则无法保证事务。
    	 * 2.步骤
    	 * (1)事务开始前,开始事务,即取消自动提交。
    	 *    con.setAutoCommit(false);
    	 * (2)如果事务的操作都成功则提交事务
    	 *    con.commit();
    	 * (3)回滚事务: 如出现异常,在catch块中回滚事务。
    	 *    con.rollback();
    	 */
    	
    	@Test
    	public void testTx(){
    		
    		Connection con = null;
    		
    		try{
    			
    			//保证连接是唯一的,传入相同的Connnection
    			con = JdbcTools.getConnection();
    			
    			//开始事务:取消默认提交
    			con.setAutoCommit(false);
    			
    			String sql = "update person set salary = salary - 500 where name = ?";
    			JdbcTools.update(con,sql,"Tom");
    			
    			int i = 1 / 0;
    			
    			String sql2 = "update person set salary = salary + 500 where name = ?";
    			JdbcTools.update(con,sql2,"Jerry");
    			
    			//正常就提交事务
    			con.commit();
    			
    		}catch(Exception e){
    			e.printStackTrace();
    			
    			//出现异常就回滚事务
    			try{
    				con.rollback();
    			}catch(SQLException e1){
    				e1.printStackTrace();
    			}
    		}
    		finally{
    			JdbcTools.releaseResource(con,null,null);
    		}
    	}

    三、数据库的隔离级别

    数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力,使它不会相互影响,避免各种并发问题。

    隔离级别: 一个事务与其他事务隔离的程度称为隔离级别。数据库规定了多种隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,一致性就越好,但并发性越弱。

         对于同时运行的多个事务,当这些事务访问数据库相同数据时,如果没有采用必要的隔离机制,就会导致各种并发问题。

    脏读 对于两个事务T1,T2,T1读取了已经被T2修改但未提交的字段。
    不可重复读      T1读取了一个字段,然后T2更新了该字段,之后T1再次读取同一个字段,值就不同了。
    幻读     T1从一个表读了一个字段,T2在该表插入一些新行,T1再读,就多几行了。

         看到上面的,我感觉不可重复读和幻读貌似区别不大,但是上网搜了下,有人说了它俩的区别。

         不可重复读的重点是修改。同样的条件, 你读取过的数据, 再次读取出来发现值不一样了。
         幻读的重点在于新增或者删除。同样的条件, 第1次和第2次读出来的记录数不一样。

    数据库提供了4种事务隔离级别

    隔离级别

    描述

    Read UnCommited(读未提交)

    允许事务读取其他事务未提交的修改。脏读、不可重复读、幻读都会出现。

    Read Commited(读已提交)

    只允许事务读取其他事务提交的数据。可避免脏读,不能避免不可重复读、幻读。

    Repeatable Read(可重复读)

         确保事务可以从一个字段读相同的值,在这个事务持续期间,其他事务不能对这个字段进行更新。可避免脏读、不可重复读,不能避免幻读。

    Serializable(串行化)

        确保事务可以从一个表读取相同行。在这个事务持续期间,禁止其他事务对该表执行插入、更新、删除。所有并发问题都可以避免,但是性能十分低下。

         Oracle 支持的 2 种事务隔离级别: READ COMMITED, SERIALIZABLE。Oracle 默认的事务隔离级别为: READ COMMITED 。Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ

    JDBC设置事务的隔离级别代码如下。

    con.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

         每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别. MySQL 默认的隔离级别为 Repeatable Read。
    查看当前的隔离级别:
    SELECT @@tx_isolation;
    设置当前 mySQL 连接的隔离级别: 
    set  transaction isolation level read committed;
    设置数据库系统的全局的隔离级别: set global transaction isolation level read committed;

  • 相关阅读:
    201521123076《java程序设计》第四次总结
    201521123076《java程序设计》第三周学习总结
    201521123076《Java程序设计》第2周学习总结
    软件工程网络15个人阅读作业2
    软件工程网络15个人作业1
    java程序设计----学生基本信息管理系统
    201521123070 《JAVA程序设计》第14周学习总结
    201521123070 《JAVA程序设计》第13周学习总结
    201521123070 《JAVA程序设计》第12周学习总结
    201521123070《Java程序设计》 第11周学习总结
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5406152.html
Copyright © 2011-2022 走看看