数据库——事务

介绍下事务,及其特性,事务隔离级别

事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序执行逻辑单元。
ACID特性:
原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)
(1)原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
(2) 一致性:事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
一致性状态是指:
1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)
2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
(3)隔离性:是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。
4)持久性:是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态。

事务隔离级别读未提交、读已提交、可重复读、顺序读/串行化
这四种隔离级别分别可以解决的不同的问题。

1、读未提交(READ_UNCOMMITTED)
读未提及,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
2、读已提交(READ_COMMITTED)
读已提交是不同的时候执行的时候只能获取到已经提交的数据。这样就不会出现上面的脏读的情况了。
3.、可重复读(REPEATABLE_READ)
可重复读就是保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别禁止了不可重复读取和脏读,但是有可能出现幻读的数据。
幻读就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。
4、顺序读(SERIALIZABLE)
顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。
数据库——事务_第1张图片
不使用隔离级别可能会出现的几种问题
(1)丢失修改
A和B两个事物同时修改同一个数据,A修改的提交在B提交之后,导致B好像没有修改,丢失修改。
(2)脏读
B事务修改了一个数据并未提交,A事物读取了这个数据,然后B事务回滚了,最后A又读取了一次,两次读取的数据不一致,称为脏读。
(3)不可重复读
A事务读取了一个数据后,B事务修改了这个数据,A事务又读取了这个数据,两次读取的数据也不一致,称为不可重复读。
(4)幻读
A事务更新了某个字段(范围是整个数据表的)(以id=1为条件的),B事务又插入了一条新的记录,导致A事务认为自己没有完全更新过来,就像出现幻觉一样。

第一种丢失修改一般使用加锁来解决,因此串行化可以解决,并且顺序读可以解决上面出现的所有问题。
第二种问题脏读是因为读取其他事物未提交的数据,因为设置读已提交隔离级别可以解决这个问题。但不可解决不可重复读和幻读的问题。
第三种问题不可能重复读,是因为B事物的修改影响了A事务的读取数据,设置可重复读隔离级别,使得B事务修改数据和A事务读取数据互不影响,隔离开来,从而解决这个问题,同时解决脏读问题。
第四种幻读问题,是因为A事务更新完数据后,B事务又插入了新的数据,设置串行化隔离级别可解决,并且这种隔离级别解决上面所有的问题。除了串行化,多版本并发控制(MVCC,Multiversion Concurrency Control)机制也可以解决该问题。

你可能感兴趣的:(数据库——事务)