数据库事务
什么是事务
事务(Transaction,简写为tx):
在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。
为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:
当每个逻辑操作单元全部完成时,数据的一致性可以保持,
而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。
事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(commit),这些修改就永久地保存下来,如果回退(rollback),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。
事务:一组操作在事务空间,要么都成功,要么都失败;
begin Transaction
insert into t_user
insert into t_accout
commit
事务的ACID属性
原子性(atomicity):指整个事务是不可以分割的工作单元。只有事务中所有的操作执行成功,才算整个事务成功,事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该回到执行事务前的状态。
一致性(consistency):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对于银行转账事务,不管事务成功还是失败,应该保证事务结束后两个转账账户的存款总额是与转账前一致的。
后面操作失败了,前面的要回滚。保证数据一致。
隔离性(isolation):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
持久性-持续性(durability):指的是只要事务成功结束它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
事务的提交与回滚
提交:commit: 当整个事务中,所有的逻辑单元都正常执行成功. ---->提交事务.---数据已经提交,不能更改.
回滚:rollback: 当整个事务中,有一个逻辑单元执行失败, ---->回滚事务.
撤销该事务中的所有操作--->恢复到最初的状态.
如何在代码中去处理事务:
1.在JDBC中,事务是默认提交的. 必须先设置事务为手动提交.
connection对象.setAutoCommit(false);//设置事务为手动提交.
2.手动的提交事务.
connection对象.commit();
3.若出现异常必须回滚事务:
不回滚事务,总余额依然是正确的. 若不回滚事务,不会释放数据库资源.
connection对象**.rollback();**
1.在JDBC在事务是默认提交的,那是在什么时候提交的.
在执行一个DML/DDL操作的时候,就已经提交事务了.
2.针对于CRUD操作. 只有DML操作才有事务,查询操作没有事务.
但是,我们一般会把查询也放在事务里面.--->Spring的事务管理的时候再讲.
3.以后,凡是发现自己编写的代码是正确的,测试也通过,但是就是数据库表中的数据不变----->事务没提交的问题. 等 我们学习MyBatis开始就会遇到这个问题了
4.MySQL中,InnoDB支持外键.支持事务,MyISAM不支持外键,不支持事务.
连接池
什么是连接池
连接池:简单的理解,就是用来装连接对象的容器
官方解释:数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
连接池里面的连接从哪里来?从数据库来;
连接池概述
在Java中,连接池使用javax.sql.DataSource接口来表示连接池. 这里的DataSource就是连接池。连接池就是DataSource
DataSource是接口,和JDBC一样,是Sun公司开发的一套接口,需要各大厂商实现;
为什么要用连接池
一段Java代码操作数据库,需要取得连接,每次操作数据库都是需要取到一个连接。
例如:新浪首页,查询体育新闻,需要一条sql,查询娱乐新闻,需要一条sql,可能一个首页面,就会存在100多个请求(到数据库查询),那这样浪费多少秒? 浪费1000秒
结论:会浪费很多时间
每次请求都会创建一个connection,因此会浪费资源(内存),当同时1000人访问的时候,那就会占用很多资源,因此很浪费时间和容器操作系统崩溃;所以,我们用连接池来提供资源利用率。
常用的连接池
常用的DataSource的实现有下面多种方式:
DBCP: Spring推荐的(Spring框架已经集成DBCP)
C3P0: Hibernate推荐的(早期)(Hibernate框架已经集成C3P0)
boneCP:淘汰了
Druid :Druid是阿里巴巴开源的"为监控而生的数据库连接池!"。 性能测试略低于HikariCP,但是提供了强大的监控和扩展功能。
Hikari:HikariCP可能是目前业内最快的数据库连接池,而且轻量的连接池. springboot默认集成Hikari
如何使用连接池(以Hikari为例说明)
步骤:
1. 导入jar包:HikariCP 3.2.0【版本根据需求】
2. 创建连接池参数HikariConfig对象
3. 连接池参数对象设置连接参数:
4. 创建连接池对象,将参数对象传入
5. 获取连接对象:getConnection();
# driverClassName驱动名【自定义即可,现在可以不写】
driverClassName=com.mysql.jdbc.Driver
# url连接ip和端口、数据库,以及字符集。都是项目中约定好的
url=jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8
# username用户名【自定义即可】
username=root
# password密码【自定义即可】
password=root
#连接池启动时的初始值
initialSize=200
#连接池的最大值
maxActive=500
#连接池的最大空闲数
maxIdle=200
写在最后:本篇博客主要和大家分享一些基础知识,其中的事务与ACID是两个面试题考点,希望大家能够多多记忆。笔者小,中,大厂均有面试经历,每日分享JAVA全栈相关知识,希望能够与大家共同进步。