事务的4个特性及事务的隔离级别

来源:互联网 发布:dw软件怎么使用 编辑:程序博客网 时间:2024/06/11 06:13

事务的4个特性:

在MySQL中,InnoDB和BDB类型表可以支持事务。通过InnoDB和BDB类型表,MySQL事务能够完全满足事务安全的ACID测试,但是并不是所有表类型都支持事务,如MyISAM类型表就不能支持事务,只能通过伪事务对表实现事务处理。

ACID指出每个事务型RDBMS必须遵守的4个属性,即原子性,一致性,隔离性和持久性。

原子性:事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。假设一个事务由多种任务组成,其中的语句必须同时操作成功,才可以认为事务是成功的,否则将回滚到初始状态。

一致性:事务是一个原子操作单元,其对数据的修改要么全都执行,要么全都不执行。假设一个事务由多种任务组成,其中的语句必须同时操作成功,才可以认为事务是成功的,否则将回滚到初始状态。

隔离性:指每个事务在自己的空间发生,和其他发生在系统中的事务隔离,而且事务的结果只在他完全被执行时才能看到。即使这样的一个系统中同时发生多个事务,隔离性也可以保证特定的事务在完成之前,其结果是不被公布的。

持久性:事务完成之后,他对于数据的修改是永久性的,即使出现系统故障也能够保持。通过使用日志,系统能够恢复在重启前后进行的最后一次成功更新,可以反应系统崩溃时处于执行过程的事务的变化。


事务的隔离级别:

数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

脏读不可重复读幻读 Read uncommitted√√√ Read committed×√√ Repeatable read××√ Serializable×××

x表示不会出现这个问题 √表示可能会出现这个问题

Serializable(序列化):顾名思义,以序列化的形式对事务进行处理,改隔离级的特点是只有当事务提交后,用户才能从数据库中查看数据的变化。该隔离级运行会影响MySQL的性能,因为需要占用大量资源,以保证大量事务在任意时间不被用户看到。

Repeatable read(可重读):对于应用程序的安全性做出部分妥协,以提高其性能。事务在该隔离级上不会被看成一个序列,不过当前在执行事务的过程中,用户仍然看不到事务的过程。知道事务被提交为止,用户才能看到事务的变化结果。

Read committed(提交后读):提交后读隔离级的安全性比重复读安全性要低。在这一级的事务,用户可以看到其他事务添加的新纪录。在事务处理时,如果存在其他用户同时对事务的相应表进行修改,那么在同一事务中不同时间内,应用select语句可能返回不同的结果集。

Read uncommitted(未提交读):该隔离级提供事务之间最小程度间隔,该隔离级容易产生虚幻读操作,其他用户可以在该隔离级上看到未提交的事务。


未提交读
session A:

session B:
这里写图片描述
session A:
这里写图片描述
session B:
这里写图片描述


提交后读:
session A:
这里写图片描述
session B:
这里写图片描述
session A:
这里写图片描述
session B:
这里写图片描述


可重读
session A:
这里写图片描述
session B:
这里写图片描述
session A:
这里写图片描述
session B:
这里写图片描述


序列化
session A:
这里写图片描述
session B:
这里写图片描述
session A:
这里写图片描述
session B:
这里写图片描述