标签:必须 避免 one roo repeat 默认 应该 结果 取数
??数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成
事务有哪些特性?
原子性(Atomicity):事务中包含的操作集合,要么全部操作执行完成,要么全部都不执行。即当事务执行过程中,发生了某些异常情况,如系统崩溃、执行出错,则需要对已执行的操作进行回滚,清除所有执行痕迹
一致性(Consistency):事务执行前和事务执行后,数据库的完整性约束不被破坏。即事务的执行是从一个有效状态转移到另一个有效状态。
隔离性(Isolation):多个事务并发执行时,彼此之间不应该存在相互影响。隔离程度不是绝对的,每个数据库都提供有自己的隔离级别,每个数据库的默认隔离级别也不尽相同。
持久性(Durability):事务正常执行完毕后,对数据库的修改是永久性的。即事务的修改操作已经记录到了存储介质中
脏读
A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据
不可重复读
事务A执行读操作,前后两次读取同一条数据的间隔中,事务B执行更改操作,将事务A读的那条数据修改了,此时事务A第二次读取到的数据和第一次读的数据不一样了,系统重复读取多次数据不一样,成为不可重复读
幻读
幻读类似于不可重复读,幻读指的是事务A在事务中用相同条件执行两次查询,在两次查询的间隔期间,事务B进行了插入或删除操作,导致A第二次查询的记录条数和第一次不一样
更新丢失
第一类(回滚覆盖):撤消一个事务时,该事务内的写操作要回滚,把其它已提交的事务写入的数据覆盖了
第二类(提交覆盖):它和不可重复读本质上是同一类并发问题,通常将它看成不可重复读的特例。两个或多个事务查询相同的记录,然后各自基于查询的结果更新记录时会造成此问题,每个事务不知道其它事务的存在,最后一个事务对记录所做的更改将覆盖其它事务对该记录所做的更改
read uncommited(读未提交)
介绍:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据,可防止丢失更新
原理:读数据不加锁,写数据加行级共享锁,提交时释放锁(只允许一个事务更新提交,防止一类丢失更新)
理解:可以读到未提交的,说明写数据时可以读,写的时候数据是共享的,读的时候也没有先加锁。但是只允许一个事务写数据并提交,防止了第一类更新丢失
read commited(读已提交)
介绍:保证一个事物提交后才能被另外一个事务读取,另外一个事务不能读取该事物未提交的数据,可以防止脏读问题
原理:事务读取数据(读到数据的时候)加行级共享锁,读完释放;事务写数据时候(写操作发生的瞬间)加行级排他锁,事务结束释放
理解:写的数据必须在提交之后才能被读到,说明写的时候加了写排它锁,防止了脏读的问题
repeatable read(重复读)
介绍:这种事务隔离级别可以防止脏读,不可重复读,但是可能会出现幻象读
原理:和读提交数据不同的是,事务读取数据在读操作开始的瞬间就加上行级共享锁,而且在事务结束的时候才释放,事务写数据时候(写操作发生的瞬间)加行级排他锁,事务结束释放
理解:读取事务一开始就加上读共享锁,防止事务期间数据被修改,事务结束才释放,就能避免不可重复读问题,要避免第二类更新丢失,事务先读后写,猜测应该有一个读共享锁升级为写排它锁的过程
serializable(序列化)
介绍:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读
原理:在读操作时,加表级共享锁,事务结束时释放;写操作时候,加表级排他锁,事务结束时释放
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 回滚覆盖(第一类) | 提交覆盖(第二类) |
---|---|---|---|---|---|
读未提交 | 允许 | 允许 | 允许 | 不允许 | 允许 |
读已提交 | 不允许 | 允许 | 允许 | 不允许 | 允许 |
可重复读 | 不允许 | 不允许 | 允许 | 不允许 | 不允许 |
序列化 | 不允许 | 不允许 | 不允许 | 不允许 | 不允许 |
标签:必须 避免 one roo repeat 默认 应该 结果 取数
原文地址:https://www.cnblogs.com/yanghanwen/p/12181078.html