事务的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: