数据库级别的事务的学习
一、事务四大特征
原子性,一致性,隔离性和持久性。
1. 原子性(Atomicity)
一个原子事务要么完整执行,要么干脆不执行。这意味着,工作单元中的每项任务都必须正确执行。如果有任一任务执行失败,则整个工作单元或事务就会被终止。即此前对数据所作的任何修改都将被撤销。如果所有任务都被成功执行,事务就会被提交,即对数据所作的修改将会是永久性的。
2. 一致性(Consistency)
一致性代表了底层数据存储的完整性,最终是为了保证数据的一致性,当经过N多个操作之后,数据的状态不会改变。它必须由事务系统和应用开发人员共同来保证。事务系统通过保证事务的原子性,隔离性和持久性来满足这一要求; 应用开发人员则需要保证数据库有适当的约束(主键,引用完整性等),并且工作单元中所实现的业务逻辑不会导致数据的不一致(即,数据预期所表达的现实业务情况不相一致)。
3. 隔离性(Isolation)
隔离性意味着事务必须在不干扰其他进程或事务的前提下独立执行。换言之,在事务或工作单元执行完毕之前,其所访问的数据不能受系统其他部分的影响。
隔离级别
读未提交 read uncommited
读已提交 read commited
可重复读 repeatable read(默认)
序列化 serializable
设置隔离级别:set session transaction isolation level +级别;(这种只会在当前窗口有效)
设置全局的隔离级别:set global transaction isolation level +级别;
产生数据不一致的情况
脏读:当一个事务对数据进行修改后,在还没有commit提交时,另外一个事务也进行了访问,使用了这个数据,因为这个数据是还没有提交的,所以就造成了第二个事务读到了这个数据的脏数据。
不可重复读:一个事务对数据进行访问时,另一个事务也访问该数据。第二个事务对数据的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
幻读:幻读与不可重复读类似。一个事务读取了几行数据,接着另一个并发事务插入了一些数据时。在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
隔离级别 | 异常情况 | 异常情况 | 异常情况 |
---|---|---|---|
读未提交 | 脏读 | 不可重复读 | 幻读 |
读已提交 | 不可重复读 | 幻读 | |
可重复读 | 幻读 | ||
序列化 |
幻读:插入和修改数据的时候会产生,查询不会产生
4. 持久性(Durability)
持久性表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,所作的修改在任何系统瘫痪时不至于丢失。