事物,连接池

一、事物

  1.事物指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功。

  2.Mysql中的事物默认是自动开关的

  3.数据库开启事务命令

      3.1start transaction:开启一次事物。该语句后面的sql语句都处于同一次事务中

      3.2rollback:回滚。事务结束(不明白)

      3.3commit:事务提交。事务结束。

  4.JDBC中事务的基本操作

       4.1JDBC程序向数据库获得一个Connection对象时,默认情况下这个Connection对象会自动想数据库提交在它上面发送的SQL语句。

             若想关闭这种默认提交方式,让多条SQL在一条事物中执行,使用一下语句

            4.1.1Connection.setAutoCommit(boolean auto):看数据库。true是自动提交事务。false是手工控制事务。

                    设置为false,就如同执行sql语句start transaction

            4.1.2Connection.rollback():就如同执行sql语句rollback

                     rollback(Saveponit sp):回滚到一个回滚点语

                    4.1.2.1Savepoint代表一个回滚点

                    4.1.2.2Connection.setSavepoint()创建一个回滚点

            4.1.3Connection.commit():事务提交;就如同sql语句commit

二、事务的特性以及隔离级别

   1.事务的特性:

        1.1原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

        1.2一致性(Consistency):指事务必须使数据库从一种状态换成另外一种一致性的状态

        1.3隔离性(Isolation):指一个事务不能被其他线程的事务所打扰

        1.4持久性(Durability):事务的操作结果能被永久的保存住。

   2.事务的隔离姓(多线程操作共同的数据时)

       2.1如果不考虑隔离性会出现一下问题

       2.1.1脏读:指一个事务读到了另一个事务中未提交的数据。

       2.1.2不可重复读:指一个事务前后读到的“同一条记录”不一致。

       2.1.3虚读(幻读):指一个事务前后读到的同一张表的记录条数不一致。

   2.2数据库可以通过设置隔离级别来控制以上不正常发生的情况

       MySQL的四种隔离级别

       2.2.1READ UNCOMMITTED:最低级别。脏读、不可重复读、虚读都可能发生。

       2.2.2READ COMMITTED:防止脏读发生,不可重复读、虚读有可能发生

       2.2.3REPEATABLE READ:防止脏读、不可重复读发生,虚读有可能发生。一般设置为该级别

       2.2.4SERIALIZABLE:最高级别,防止脏读、不可重复读、虚读。

   2.3MySQL与事务隔离级别操作有关的语句

         SELECT @@tx_isolation:查看当前的事务隔离级别

         SET transaction isolation level 隔离级别(就是上面的四种级别)

  2.4JDBC程序中控制隔离级别

         2.4.1在JDBC中有四个常量表示四个级别

                 Connection:

                 int TRANSACTION_READ_UNCOMMITTED:

                 int TRANSACTION_READ_COMMITTED

                 int TRANSACTION_REPEATABLE_READ 

                 int TRANSACTION_SERIALIZABLE

          2.4.2Connection.setTransactionIsolation(int level):设置隔离级别

                 一定要在事务开启前设置隔离级别,否则无效

三、数据库连接池

      1.数据库连接原理

          数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”   中取出一个,使用完毕之后再放回去

          标准的数据源就要实现javax.sql.DataSource接口

      2.编程的难点:调用close方法时,应该把连接对象返回池总,就需要改进close方法。

           改进可以有一下三种方式

             1)继承(不适用)

             2)包装设计模式

         开发步骤

             1>定义一个类,实现与被增强对象相同的接口或者继承已有包装类或者被增强对象

             2>类中定义一个私有变量,记住被增强对象的引用

             3>定义一个构造方法,传入被增强对象

             4>对于要增强的方法,直接编写增强代码即可

             5>对于不需要增强的方法,调用原有对象的方法。

       3.默认适配器设计模式

            3.1原理:用一个抽象类去实现那个拥有多个方法的接口,在这个抽象类中实现该接口的所有方法,但都是空方法去实现的。

                   以后只需要继承这个抽象类,不需要去继承原有的接口,只要实现所需要的方法就可以了

        4.动态代理

            4.1基于接口:被代理对象有实现的接口。Proxy

            4.2基于子类:CGLIB开库

        5.两个开源的数据连接池           

             5.1DBCP

                  DBCP:Apache开发的。Database Conntion Pool

                   步骤:

                       1)拷jar包commons-dbcp.jar commons-pool.jar

                       2)建立一个配置文件:*.properties

                       3)建一个工具类

posted @ 2014-03-09 02:59  JAVA之迷  阅读(127)  评论(0编辑  收藏  举报