MySQL
1. ACID
- 原子性(atomicty):事务只能有要么提交成功与回滚失败
- 一致性(consistency):一个事务在执行之前和执行之后,数据库都必须处于一致性状态。若数据库运行过程中发生故障,未完成的事物不会写入数据库
- 持久性(durability):事务成功提交,数据会被持久化保存到数据库,之后发生操作系统故障或数据库宕机,重启数据库后,成功提交的数据仍然在数据库中
- 隔离性(isolation):并发环境中,并发的事务相互隔离。
2. 设计思想
- Java 事务控制的基本单位:
java.sql.Connection
- 数据库本身与应用建立
Connection
连接线程数量有限
java.sql.Connection
重要特性
线性操作
:操作时序
上,事务和事务间执行是线性依次排开执行
不限执行SQL次数
:建立连接后可以不限执行事物次数。连接池应用(执行完事务后不关闭事物,放进连接池)
- 如何执行线性操作
- 多线程互斥访问,通过
加锁
实现,一个线程中,一个事务有多个SQL操作时,要么全成功要么回滚(原子性)
- 连接池管理
Connection
- 管理一批Connection对象,一般会有
连接数上限
设置; - 为每一个获取Connection请求做
资源分配
;如果资源不足,设置等待时间 - 根据实际Connection的使用情况,为了提高系统之间的利用率,
动态调整连接池中Connection对象的数量
,如应用实际使用的连接数比较少时,会自动关闭掉一些处于无用状态的连接;当请求量大的时候,再动态创建。
3. 隔离级别
- 锁库:一次只能有一个客户端对数据库访问
序列化读
(锁全表):
- 一个客户端访问一张表时,必须在客户端对该表事务提交完成(回滚)后才能进行访问
- 一个事务操作多张表时,任意一张表会被当作互斥资源访问
可重复读
(行级锁)
- 同一张表
同行
可以多个客户端访问 幻读
(insert) :一个客户端在事物执行过程中对表有插入操作
,另一个客户端在同一个查询事物前后两次查询返回记录数不一致
读已提交(update)
:读写分离的机制,读是共享锁
可以同时进行,写是互斥锁
,同时只能有一个写资源的事务。
弊端
:不可重复读
:有更新操作时,同一个事物内,相同的两次查询,结果不相同幻读
:插入操作时,相同查询结果不同
读未提交
弊端
:脏读
:客户端A读取到了客户端B要更新但还未提交的内容
不可重复读
:有更新操作时,同一个事物内,相同的两次查询,结果不相同幻读
:插入操作时,相同查询结果不同