1.事务特性ACID

1.1 事务的四大特性

1、原子性(Atomicity)

事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。

2、一致性(Consistency)

数据库的数据状态是一致的。

3、持久性:(Durability)

事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。

4、隔离性(Isolation)

一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

1.2 一致性和原子性的区别

一致性是保证整个操作成功或失败是符合预期的,原子性,隔离性,持久性这三个特性是为了约束事务最终实现数据的一致性。一致性和原子性的区别是:一致性强调的最终状态,要么是初始状态(事务回滚),要么是最终状态(任务成功执行完成);原子性强调的是操作的完整性,连续的操作不可分割,要么全部成功,要么全部失败。

举例:张三给李四转账100元。那数据库假设需要 张三扣100,李四加100,记录一条流水。如果流水没记录成功,那整体回滚,张三也没转账成功,李四也没多钱。这就是原子性的体现。而张三必须扣100,李四必须加100,这个就是一致性了,如果因为某些逻辑原因,导致张三扣了100,流水记录100转账,而李四只加了60。然后这3条操作都成功了,那原子性就符合了,但是一致性就不符合了。

2.事务的隔离级别

2.1 事务并发问题

1、脏读(最严重,杜绝发生)

指一个事务读取了另外一个事务 未提交的数据。

2、不可重复读

在一个事务内多次读取表中的数据,第一次未修改,第二次修改了,多次读取的结果不同(强调的是数据内容的变化)

3、幻读(虚读)

在一个事务内多次读取表中的数据,第一次未增删,第二次增删了,多次读取的结果不同。(强调的是数据数量的变化)

2.2 隔离级别

1.read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。

存在:3个问题(脏读、不可重复读、虚读)。

解决:0个问题

2.read committed 读已提交,一个事务读到另一个事务已经提交的数据。

存在:2个问题(不可重复读、虚读)。

解决:1个问题(脏读),通过在写的时候加锁,可以解决脏读。

3.repeatable read :可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。

存在:1个问题(虚读)。

解决:2个问题(脏读、不可重复读),通过在读的时候加锁,可以解决不可重复读。

4.serializable :串行化,同时只能执行一个事务,相当于事务中的单线程。

存在:0个问题。

解决:3个问题(脏读、不可重复读、虚读),通过串行化,可以解决虚读。

安全和性能对比

安全性:serializable > repeatable read > read committed > read uncommitted

性能 : serializable < repeatable read < read committed < read uncommitted

常见数据库的默认隔离级别:

MySql:repeatable read

Oracle:read committed

版权声明:本文为t0101原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/t0101/p/13164338.html