何为“ 事务管理 ”?
“事务”是一个逻辑单元,其中包含一系列的操作,事务遵循4个基本特性(ACID):
- Atomic(原子性,此处指的是事务中的各个操作不可分割)
事务中包含的操作被看作是一个逻辑单元,这个单元中的操作要么全部成功,要么就全部失败;
- Consistency(一致性)
意味着:只有合法的数据可以被写入数据库,如果数据有任何不符合要求的,则事务应该将其会滚到最初状态;
- Isolation(隔离性)
允许多个用户对同一数据的并发访问,而不破坏数据的正确性和完整性,同时,并行事务的修改必须与其他并行事务的修改相互独立;可以这样理解,一个事务的数据要么是另外一个事务修改这些事务之前的状态,要么是第二个事务已经修改完成的数据,但是这个事务不能够看到其他事务正在修改的数据;
- Durability(持久性)
事务结束后,事务必须要得到固化(将其存储到数据库里,或保存到某硬件设备里);
何为“ 数据库事务管理隔离等级 ”?
事务隔离指的是:数据库(或其他事务系统)通过某种机制,在并行的多个事务之间进行分隔,使每个事务在其执行过程中保持独立;
Hibernate中的事务隔离依赖于底层数据库提供的事务隔离机制,因此对数据库事务隔离机制的理解在基于Hibernate实现的持久层中同样适用;
数据操作过程中可能出现的3种不确定情况:
脏读取(Dirty Reads) :一个事务读取了另一个事务为提交的数据;
不可重复读取(Non-repeatable Reads) :一个事务再次读取之前曾读取过的数据时,发现该数据已经被另一个已提交的事务修改;
虚读(Phantom Reads) :一个事务重新执行一个查询,返回一套符合查询条件的记录,但这些记录中包含了因为其他最近提交的事务而产生的新记录;
为了避免上面3中情况发生,标准的SQL规范中,定义了4个事务隔离等级;
Read Uncommitted:
最低等级的事务隔离,仅仅保证了读取数据中不会读到非法数据,这种等级下,上述的不确定情况均可能发生;(很容易出现脏读取);
Read Commited:
此级别的事务隔离保证一个事务不会读到另一个并行事务已修改但未提交的数据,此等级已经避免了脏读取的情况;(当一个事务处于在此隔离等级中,一个Select查询只能看到查询开始之前提交的数据,永远看不到为提交的数据,或者运行时提交的数据);
Repeatable Read:
此级别的事务隔离避免了“脏读取”和“不可重复读取”现象的出现,意味着:一个事务不可能更新已经由另一个事务读取但未提交的(回滚)的数据;[一般情况下,此级事务应用并不广泛,不能保证数据的合法性(可能会出现虚读),但是性能代价较大,如果当前数据库由应用所独享,可以考虑用“乐观锁”达到同样的目的];
Serializable:
最高登记的事务隔离级别,提供了最严格的隔离机制,上面的3种情况都将会避免掉,这个级别模拟事务的串行执行,逻辑上如同所有事务都处于一个执行队列,依次串行执行,而非并行执行;[此事务隔离级别提供了最严密的隔离机制,但是同时也带来了高昂的性能开销,需谨慎使用,如果需要,可以通过“悲观锁”来解决];
隔离等级 | 脏读取 | 不可重复读取 | 虚读 |
Read Uncommitted | 可能 | 可能 | 可能 |
Read Commited | 不可能 | 可能 | 可能 |
Repeatable Read | 不可能 | 不可能 | 可能 |
Serializable | 不可能 | 不可能 | 不可能 |