1.事务
事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。
2.事务的四个特性
① 原子性(atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
事务是一个原子操作, 由一系列动作组成。 组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。
事务中的任何一个数据库操作失败,已经执行的任何操作都必须被撤销,让数据库返回初始状态。
② 一致性(consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
一旦所有事务动作完成, 事务就被提交。数据和资源就处于一种满足业务规则的一致性状态,即数据不会被破坏。
③ 隔离性(isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。准确地说,并非要求做到完全无干扰。
数据库规定了多种事务隔离级别,不同的隔离级别对应不用的干扰程度。隔离级别越高,数据一致性越好,但并发行越弱。
④ 持久性(durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。
3.事务的隔离
数据库中读取数据存在的三大问题:
①脏读(dirty read):一个事务读到其它事务未提交的数据。
②不可重复读:在同一个事务当中,第一次和第二次读取的数据不一样。
③幻读:读到的数据是假的。
事务和事务之间的隔离级别有四个级别
①读未提交:read uncommitted(最低的隔离级别):事务A可以读取到其他事务未提交的数据
存在的问题:存在脏读现
②读已提交:read committed:事务A 只能 读取到其他事务提交后的数据。
存在的问题:解决了脏读的现象,但存在不可重读现象。
这种隔离级别是比较真实的数据,每一次读到最真实的数据。
oracle数据库默认的隔离级别是read committed。
③可重复读:repeatable read:事务A开启后,只要不提交事务A,每一次在事务A中读到的数据都是一致的,即使事务B将数据修改并且提交了,事务A读取到的数据还是之前的。
存在的问题:每一次读取到的数据都是幻象,不够真实。
是mysql中默认的事务隔离级别。
④序列化:serializable(最高的隔离级别):效率最低,解决了所有的问题,这种隔离级别表示事务排队,不能并发,每一次读到的数据都是最真实的