MySql教程

mysql事务(ACID)

本文主要是介绍mysql事务(ACID),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一,原子性:

一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

例:在银行存钱时,要么全部存入银行,要么都没有存入,不会一半存入一般没有存入。

二,一致性:

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

例:存钱以前你的钱是人民币,存完钱后也是人民币,不会变成美元或者别的。

三,隔离性:

数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

例:同一时间在银行取钱和存钱的人很多,但是都不会互相影响。

1)读为提交:已经写入数据,但是还没有提交。这种隔离可能会产生脏读。

脏读:在mysql中a往一张表中写入新的数据,但是不保存,过一会取消写入这条数据,在a创建和取消的这段时间里b在这张表中可以读到这条数据,称之为脏读。意思是我a虽然写入数据,但是没有保存,然后撤销了写入的数据,b能看到,但是当a撤销以后,数据就会丢失。

2)读提交:写入数据并提交。可能会产生不可重复读。

不可重复读:当a现在查看表里的数据以后,现在想显示出某些数据的平均值,在这期间b向表里写入新的数据,此时表中的数据已经更改,而a完全不知道,但是算平均值时会加上b新写入的数据,这就造成了a查看平均数时与自己算的结果不一样的情况。

a查表:10  6  7  5   平均值应该为7

b写入:12    

表中数据:10  6  7  5  12  平均值8

此时a求平均值:显示8,与a查表时应该得到的平均值不一样。

3)可重复读:可以重复读到数据。可能会产生幻读。

幻读:当a和b同时查看表时发现没有c这个数据,此时a先向表中添加c这条数据,并保存。b这边查完以后向表中添加数据c,但是会显示已有这个数据,无法添加,此时产生幻读。因为a已经写入数据,而b此时已经接收到了数据,只是没有显示出来,此时就好像b已经读到了数据一样。

4)串行化:当a准备向表中添加数据时,其他人就不能操作这张表,等a操作完以后其他人才可以操作这张表。

四,持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

例:你在银行存钱的时候,刚存完断电了,下次去查看的时候钱还在,不会丢失。

总结:隔离等级越高,性能越低,mysql默认使用的隔离等级是可重复读。

这篇关于mysql事务(ACID)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!