数据库 事务 (总)

buzheng11 / 2023-08-28 / 原文

一、事务四大特征(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)实现:“行级锁”
缺点:可以解决并发事务的所有问题。但是效率地下,消耗数据库性能,一般不使用。


三、读

1、脏读
针对未提交数据,前一个事务回滚导致。
              
事务 B 去查询了事务 A 修改过的数据,
但是此时事务 A 还没提交,所以事务 A 随时会回滚导致   事务 B 再次查询就读不到刚才事务 A 修改的数据了,这就是脏读

2、不可重复读
针对其他提交前后,读取数据本身的对比
产生的原因主要是数据的更新
    

明显 A 值是不可重复读的。
因为事务 B 和事务 C 一旦更新值并且提交了,事务 A 会读到别的值,
所以此时这行数据的值是不可重复读的。

3、幻读
针对其他提交前后,读取数据条数的对比
主要是数据的新增或删除导致
  


事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。


四、C#中使用



五、跨服务事务处理机制