天天看点

事务的ACID与隔离级别

定义

事务是应用程序中一系列严密的操作,所有操作必须一起成功完成,否则在每个操作中进行的更改都会被撤销。

ACID

事务具有四个特征:

1.原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都完成,要么都不完成。

2.一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态,对于整个数据的完整性保持稳定。

3.隔离性(Isolation):事务与事务之间互不干扰,即一个事务内部的操作及使用的数据对其它并行事务是隔离的。

4.持久性(Durability):事务一旦提交,对数据库中的数据更改就是永久性的。

隔离级别

在并发处理数据时,所采取的数据隔离机制。

若没有采用有效的隔离机制,并发处理数据时会出现以下问题:

1.第一类丢失更新:撤销一个事务时,把其它事务已提交的更新数据覆盖。

2.脏读:一个事务处理过程中读取了另一个未提交的事务中的数据。

3.幻读:也叫虚读,一个事务执行两次查询,第二次结果集包含第一次没有或某些行已经被删除的数据,造成两次结果不一致,这是另一个事务在这两次查询中间插入或删除了数据造成的。

4.不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了数据。

5.第二类丢失更新:是不可重复读的特殊情况,如果两个事务都读取同一行,然后两个都进行写操作,并提交,第一个事务所做的改变就会丢失。

注意:

不可重复读和脏读的区别是:脏读是某一事务读取了另一个事务未提交的脏数据,不可重复读则是读取了前一事务提交的数据。

不可重复读和幻读的区别是:幻读和不可重复读都是读取了另一条已经提交的记录,所不同的是不可重复度查询的是同一数据项,而幻读针对的是一批数据整体(比如数据的个数)。

事务的隔离级别有四种,

1.Read uncommitted(最低级别,任何情况都无法保证)

读未提交,顾明思义,就是一个事务可以读取另一个未提交事务的数据。

会有脏读的情况。

2.Read committed(可避免脏读的发送)

读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。

会出现不可重复读问题。

3.Repeatable read(可避免脏读、不可重复读的发送)

重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。

会出现幻读的情况。

4.Serializable(可避免脏读、不可重复读、幻读的发送)

序列化,是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

大多数数据库默认的事务隔离级别是Read committed,比如sql server和oracle。

Mysql默认的隔离级别是Repeatable read。

隔离级别的设置只对当前连接有效,对于使用mysql命令窗口而言,一个窗口相当于一个链接;对于JDBC操作数据库来说,一个Connection对象相当于一个链接。

设置数据库隔离级别一定是要在开启事务之前。

继续阅读