事务及事务的隔离级别
1.什么是事务
事务是由一系列对系统中数据进行访问与更新的操作组成的程序执行逻辑单元。事务是DBMS中最基础的单位,事务不可分割。(事务是一个或多个连接在一起作为一个逻辑单元运行的SQL语句。DBMS认为事务是不可分割的,要么全部执行,要么全不执行。)
2.事务的四个特性
1.原子性:要么事务中所有的数据修改都执行,要么都撤销。(操作这些指令时,要么全部执行成功,要么全部不执行。只要其中一个指令执行失败,所有的指令都执行失败,数据进行回滚,回到执行指令前的数据状态。)
2.一致性:完全的事务应让数据保持一致来保证数据完整。一致状态要保证满足所有数据约束。(事务的执行使数据从一个状态转换为另一个状态,但是对于整个数据的完整性保持稳定。)
3.隔离性:事务的影响独立(或隐藏)于其他事务。(隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。)
4.持久性:在事务完成后,它的影响是永久的和持续的,即便是系统崩溃。(当事务正确完成后,它对于数据的改变是永久性的。)
3.并发事务导致的问题
1.脏读:指一个事务在处理过程中读取了另一个未提交事务中的数据。
2.幻读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。(例如第一个事务对一个表中的数据进行修改,这种数据涉及到表中的全部数据行,同时,第二个事务也对这个表数据进行修改,这个修改是对表中新增/删除一条数据,那么操作第一个事务的用户发现表中的数据还没有修改的数据行,就好像发生了幻觉一样,这就是发生了幻读。)
3.不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。
注:不可重复读和脏读的区别:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
4.事务的四种隔离级别
1.读未提交:就是一个事务可以读取另一个未提交事务的数据。(隔离级别最低,任何情况都无法保证。)
2.读已提交:就是一个事务要等另一个事务提交后才能读取数据。(可避免脏读的发生。)
3.可重复读:就是在开始读取数据(事务开启)时,不再允许修改操作。(可避免脏读、不可重复读的发生。)
4.串行化/序列化:是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。(可以避免脏读、不可重复读与幻读。)
来源:CSDN
作者:枫^.^
链接:https://blog.csdn.net/vmxhc1314/article/details/100856490