事务 Transaction
指一组操作包含多个单一的逻辑,如一个逻辑没成功,则全部失败,数据全部回到最初状态
WHY
为确保逻辑的成功,如银行转账
使用命令行方式演示事务
开启事务:
start transaction;
提交或回滚事务:
commit
rollback
关闭自动提交:
set autocommit=off
使用代码方式演示事务
主要是针对连接(connection)的
1.通过conn.setAutoCommit(false)来关闭自动提交的设置
2.提交事务 conn.commit()
3.加滚事务 conn.rollback()
事务的特性ACID
-
原子性Automicity
事务中的逻辑不可分割
-
一致性Consistency
事务执行前后数据的完整性
-
隔离性Isolation
事务在执行中不应受到其他事务的影响
-
持久性Durability
事务执行成功后,数据持久保存到磁盘上
事务的安全隐患
1.读
- 脏读
一个事务读到另一个事务还未提交的数据
查看隔离级别
select @@tx_isolation;
设置隔离级别为 读未提交
set session transaction isolatioin level read uncommitted
>read uncommitted 读未提交
read committed 读已提交
repeatable read 可重复读
serializable 可串行化
一连接设为串行化后,哪个事务先打开,谁就有先执行的权利,其他事务只能等着。特点 是会造成性能的问题
效率排名:读未提交>读已提交>可重复读>可串行化
-
不可重复读
一个事务读到了另一个事务提交的数据,造成前后两次查询结果不一致
解决了脏读问题,但引发了在事务中两次读取的数据不一致的问题,即不可重复读问题 -
幻读
一个事务读到了另一个事务已提交的插入的数据,导致多次查询结果不一致
2.写
-
丢失更新
-
悲观锁
在查询时,加入for update
select * from account for update(数据库锁机制,排他锁) -
乐观锁
要求程序员自己控制
在表中加一个字段version,事务提交时比较自己的version与数据库是否一样,不一样则先更新再提交,提交后再将version变更
数据库连接池
开源连接池
DBCP
DataBase Connection Pool 数据库连接池,由Apache开发
jar:
commons-dbcp-.jar
commons-pool-.jar
1.构建数据源对象
BasicDataSource dataSource = new BasicDataSource();
使用代码方式确定连接的数据库
dataSource.setDriverClassName("");
dataSource.setUrl(“jdbc:mysql://localhost/bank”);// 主协议:子协议://本地/数据库
dataSource.setUsername("");
dataSource.setPassword("");
使用配置文件方式确定连接的数据库
BasicDataSourceFactory factory = new BasicDataSourceFactory();
Properties = properties = new Properties();
InputStream is = new FileInputStream(“src//dbcpconfig.properties”);
DataSource dataSource = factory.createDataSource(properties);
2.得到连接对象
coon = dataSource.getConnection();
C3P0
企业用的较多,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,使用它的有Hibernate,Spring等
jar:
c3p0-*.jar
1.构建数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
使用代码方式确定连接的数据库
dataSource.setDriverClassName("");
dataSource.setJdbcUrl(“jdbc:mysql://localhost/bank”);// 主协议:子协议://本地/数据库
dataSource.setUser("");
dataSource.setPassword("");
使用配置文件方式确定连接的数据库
;
配置文件用xml或properties,
2.得到连接对象
coon = dataSource.getConnection();
DBUtils
commons DbUtils是Apache提供的一个对JDBC进行简单封装的开源工具类库
dbutils只是简化了CRUD的代码,连接创建和获取则不在它的范围
QueryRunner queryRunner = new QueryRunner(new ComboPooledDataSource());
queryRunner.update(sql, params);
queryRunner.query(sql, new ResultSetHandler<>, params);
ResultSetHandler是匿名实现类,实现handle
Account account = queryRunner.query(sql, new BeanHandler(Account.class), params);
BeanHandler是已提供的类
BeanListHandler
ResultSetHandler常用实现 类
BeanHandler 查询到的数据封装成一个对象
BeanListHandler 封装成对象list
ArrayHandler 封装成一个数组
ArrayListHandler 封装成一个数组元素的集合
MapHandler
MaplistHandler
ColumnListHandler
KeyedHandler
ScalarHandler
元数据 Meta data
描述数据的数据
1.数据库元数据
2.参数元数据
3.结果集元数据