1、事务:事务就是一可控的方式对数据资源访问的一组操做。为了保证事务操做先后,数据资源所承载的系统状态始终处于“正确”的状态,数据库
事务自己持有4个限定属性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这也是常说的事务的ACID属性。安全
1.原子性:原子性要求事务所包含的全部操做是一个不可分割的总体,这些操做,这些操做要么所有操做成功,只要有一个失败,就所有失败。并发
2.一致性:一致性要求事务所包含的操做不能违反数据资源的一致性检查,数据资源在事务执行以前处于摸个数据一致性状态,那么,事务执行以后也依然须要保持数据间一致性状态。例如:银行转帐,A用户想B用户转帐500元。那么A用户帐户减小500元,B用户帐户多500元。若是事务操做结束,整个数据状态不是这个样子,那么系统就处于不一致状态。性能
3.隔离性:事务的隔离性主要规定了各个事务之间相互影响程度。隔离性概念主要面向数据库并发访问,并兼顾影响事务的一致性。当两个事务或者更多事务同事访问赞成数据资源的时候,不一样的隔离级别决定了各个事务对该数据资源访问的不一样行为。事务的隔离级别主要有四种,从弱到强分别为Read Uncommitted、Read Committed、Repeatable Read和Serializable。大数据
Read Uncommitted :它是最低的隔离级别。Read Uncommitted最直接的效果就是,一个事物能够读取另外一个事务没有提交的更新结果。Read Uncommitted是以较低的隔离度来寻求较高的性能,其自己没法避免如下几个问题。spa
脏读(Dirty Read):若是一个事务对数据进行更新,可是事务尚未提交,另外一个事务就能够“看到”该事务灭有提交的更新结果。这样形成的问题就是,若是第一个事务回滚,那么第二个事务再次以前所“看到”的数据就是一笔脏据。事务
不可重复读(Non-Repeatable Read):不可重复读是指同一个事务在整个事务过程当中对同一笔数据进行读取,每次读取结果都不一样。若是事务1在事务2的更新操做以前读取一次数据,在事务2的更新操做以后在读取同一笔数据,两次结果是不一样的。因此Read Uncommitted也没法避免不可重复读取的问题。ci
幻读(Phantom Read):幻读是指同一个查询在整个事务过程当中屡次执行后,查询所得的结果是不同的。幻读针对的是多笔记录。在Read Uncommitted隔离级别下,无论事务2的插入操做是否提交,事务1在插入操做以前和以后执 行相同的查询,取得的结果是不一样的,因此,Read Uncommitted是没法避免幻读问题。资源
Read Committed:Read Committed是大多数数据库的默认隔离级别。在该隔离级别下,一个事务的更新操做结果只有在该事务提交以后,另外一个事务才可能读取到同一笔数据更新后的结果。因此,Read Committed能够避免Read Uncommitted 隔离级别下 存在脏读问题,可是没法避免不可重复读和幻读问题。it
Repeatable Read:Repeatable Read隔离级别能够保证在整个事务中,对同一笔数据的读取结果是相同的,无论其余事务是否同时在对同一笔数据进行更新操做,也无论其余事务对同一笔数据的更新提交与否。Repeatable Read隔离级别避免了脏读和不可 重复读问题,可是没法避免幻读。
Serializable:它是最严格的隔离级别,全部事务操做都必须一次按顺序执行,能够避免其余隔离级别遇到的全部问题。,是最安全的隔离级别,但同时也是性能最差的隔离级别。全部事务依次按顺序执行,并发度降低,吞吐量上不去。
对于数据库来讲,一般都有一个默认的隔离级别,大数据状况下都是Read Committed。并且,并不是全部的数据都支持这四种隔离级别,好比Oracle只支持Read Committed和Serializable。若是指定的隔离级别当前数据不支持,那么数据库会采用默认的隔离级别代替指定的隔离级别。Spring、JDBC等数据访问方式,都容许咱们为事务指定隔离级别,可是最终事务是否以指定的隔离级别执行,则由底层数据库来决定。
隔离程度与并发性、一致性之间的关系:
4.持久性:事务的持久性是指,一旦整个事务操做成功提交,对数据所作的变动将被记录并不可逆转。