事物,连接池
一、事物
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)建一个工具类