事务和连接池简介

来源:互联网 发布:java统计网站访问量 编辑:程序博客网 时间:2024/06/08 05:08

连接池

连接数据库 获取连接的过程非常消耗数据库资源
减少数据库创建连接的次数-->极大的优化数据库的性能
不用连接池 数据库会为每一个用户的来访创建一个链接

数据库连接池(DataSource)

也称为数据源 在应用开始前就创建多个数据库的连接而不销毁同时管理起来 犹如放在一个池子里
用户来访问时 不是直接通过数据库获取连接 而是从连接池中获取连接 再通过连接操作数据库 再将连接返回给连接池(方便别的访问获取)
连接池中连接数量 
由最小数据库连接数m设定(无论使用与否 保证至少拥有m个连接) 太大会浪费数据库连接资源
最大数据库连接数量n限定了连接池能占有的最大连接数(请求超过n加入等待队列 会影响后面的数据库操作)

m和n相差很大 先请求获利 超过m建立新的数据库连接 使用完放到连接池中等待重复使用(或空间超时后释放)

事务

提交:commit
回滚:rollback

特性:ACID

原子性Atomicity 事务包含的操作全部成功(应用到数据库)or全部失败回滚(对数据库无影响)
一致性Consistency 转账 保证总额一定 事务执行前后状态一致
隔离性Isolation 多个并发事务互相隔离
持久性Durability 事务提交后的修改是永久的

不考虑隔离

脏读:一个事务处理过程中读取了另一个未提交事务中的数据
A给B转100后通知B看(未提交时) B会发现多100 后面A不提交 事务回滚 (实际)B再看没多100
不可重复读:对于数据库中某个数据,一个事务范围多次查询返回不同值(查询间隔被另一事务修改提交)
虚读(幻读):对一批数据数据整体读取了另一条已经提交的事务

事务隔离级别 四种

Read uncommitted(读未提交)最低级别 都无法保证
Read committed(读已提交)避免脏读
Repeatable read(可重复读)避免脏读,不可重复读
Serializable(串行化)可避免脏读,不可重复读,幻读
隔离级别由弱到强
级别越高执行效率越低Serializable用锁表(类似java多线程的锁)使其他线程在锁外等待
选择根据实际情况 
MySQL默认是可重复读Repeatable read
Oracle只支持Serializable(串行化)和Read committed(读已提交)默认为Read committed
select @@tx_isolation;查询当前事务的隔离级别
set transaction isolation level 隔离级别名称;set tx_isolation=’隔离级别名称’;设置 在开启事务之前

事务操作

select @@autocommit;查询当前提交状态 1 true 0 false
set @@autocommit = 0;关闭自动提交
start transaction 开启一个新事物
commit 提交事务
rollback 回滚事务
savepoint 设置事务回滚点



原创粉丝点击