1、事务介绍
- 事务,其实指的就是一组操作,里面包含许多个单一的逻辑。只要一个逻辑没有执行成功,那么都算失败。所有的数据都回归到最初的状态(回滚)。
- 为什么要有事务? 为了确保逻辑的成功。例如:银行的转账
- 使用命令行方式演示事务:
commit,提交事务,数据将会写到磁盘上的数据库。rollback,数据回滚,回到最初状态。 - 使用代码方式演示事务:
注:事务只针对当前的连接对象,如果再开一个连接对象,那么还是默认的提交。
2、事务的特性(ACID)
面试可能会问
- 原子性(Atomicity),指的是事务中包含的逻辑,不可分割
- 一致性(Consistency),事务执行前后,数据完整性
- 隔离性(Isolation),事务在执行期间,不应该受到其他事务的影响
- 持久性(Persistence),指的是事务执行成功,那么数据应该持久保存到磁盘上
3、事务的安全隐患
不考虑隔离级别设置,可能会出现以下问题:
- 读:脏读、不可重复读、幻读。脏读,是一个事务读到另一个事务还未提交的数据。不可重复读,一个事务读到了另一个事务提交的数据,造成了前后两次查询结果不一致。幻读,专指新插入的行,一个事务读到了另一个事务已提交的插入的数据,导致多次查询结果不一致。
- 隔离级别:读未提交、读已提交、重复读、可串行化。读未提交,引发问题脏读。读已提交,解决脏读,引发不可重复读。可重复读,解决脏读、不可重复读,未解决幻读。可串行化,解决脏读、不可重复读、幻读。
- mysql,默认的隔离级别是可重复读;Oracle,默认的隔离级别是读已提交。
- 写:丢失更新
解决丢失更新:悲观锁、乐观锁。乐观锁要求程序员自己控制。
3、数据库连接池
- 数据库的连接对象创建工作,比较消耗性能。
- 数据库连接池,一开始先在内存中开辟一块空间(集合),往池子里放置多个连接对象。后面需要连接的话,直接从池子里面取,不要自己创建连接了。使用完毕,记得归还连接。确保连接对象能循环使用。
- 如何实现归还连接?在DataSource 接口中,没有定义,所以添加了addBack()方法,用来归还连接。但是也出现了如下问题:
- 如何解决?可以使用装饰者模式、动态代理等方法。
4、开源的连接池
- DBCP,导入包,下面的方法不常用,为不使用配置文件连接数据库。
使用配置文件连接数据库
- C3P0,比较常用。下面是代码实现:
下面是配置文件实现,如下图,只需要new以下就好,会默认去代码下加载配置文件,所以配置文件一定要按照官网上的命名:
5、DBUtils介绍
DBUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发。
- 增删改
- 查
下面是简化后的版本:
- ResultSetHandler常用的实现类
6、DBUtils通用的增删改方法
7、DBUtils通用的查询方法
既然是通用的查询方法,可能想要查询的是不同的表,也就会返回不同的对象或者值,如何实现通用性呢?可以把封装数据这个工作交给用户,也就是多传一个对象参数,告诉函数本身,要封装成怎样的对象。
结束!