一、事务四大特征(ACID)
1、原子性(Atomicity): 事务开始后所有操作,要么全部做完,要么全部不做(回滚),不可以部分执行。2、一致性(Consistency): 数据一致性,数据库的完整性约束没有被破坏。3、隔离性(Isolation): 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。4、持久性(Durability): 一旦事务提交,其对数据库的更改将永久保存,并且不会丢失。二、事务隔离层级(隔离性)
隔离级别定义了事务与事务之间的隔离程度。隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
1、读未提交(Read uncommitted) (相当于with(nolock))
(1) 定义:如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。缺点:会产生脏读、不可重复读、幻读。2、读已提交(Read committed) 默认隔离级别(Oracle和SQLServer默认的)
(1)定义: 一个事务读取到其他事务提交后的数据 ,A事务在 X表插入数据,在未提交的情况下,则B事务无法做 包含A事务新数据的 操作 (2)实现:“瞬间共享读锁”和“排他写锁”缺点:会产生不可重复读、幻读。3、可重复读(Repeatable read) (MySQL默认的隔离级别)(相当于(HOLDLOCK)
(1)定义:就是一个事务对同一份数据读取到的相同,不在乎其他事务对数据的修改(2)实现:“共享读锁”和“排他写锁”缺点:会产生幻读。4、序列化
(1)定义:事务串行化执行,隔离级别最高,牺牲了系统的并发性。(2)实现:“行级锁”缺点:可以解决并发事务的所有问题。但是效率地下,消耗数据库性能,一般不使用。![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104713365-556908051.png)
三、读
1、脏读
针对未提交数据,前一个事务回滚导致。![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104713916-1597660480.png)
![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104714317-1003073707.png)
2、不可重复读
针对其他提交前后,读取数据本身的对比产生的原因主要是数据的更新![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104714722-1212010392.png)
![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104715093-813816714.png)
![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104715562-1760879398.png)
明显 A 值是不可重复读的。因为事务 B 和事务 C 一旦更新值并且提交了,事务 A 会读到别的值,所以此时这行数据的值是不可重复读的。
3、幻读
针对其他提交前后,读取数据条数的对比主要是数据的新增或删除导致
![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104716020-217974181.png)
![](/i/l/?n=23&i=blog/2575142/202308/2575142-20230828104716465-1167763007.png)
事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
四、C#中使用
五、跨服务事务处理机制
标签:事务,隔离,幻读,数据库,提交,数据 From: https://www.cnblogs.com/buzheng11/p/17661697.html