一、事务四大特征(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#中使用
五、跨服务事务处理机制
标签:事务,隔离,幻读,数据库,提交,数据 From: https://www.cnblogs.com/buzheng11/p/17661697.html