原子性(Atomicity):事务的所有操作在数据库中要么全部执行成功,要么全部执行
失败。
一致性(Correspondence):事务操作前后,数据的完整性必须保持一致。
隔离性(Isolation):多个用户并发访问数据库时,数据库为每个用户开启事务,不
能被其他事务的操作数据所干扰。即每个事务都感觉不到系统中有其他事务在并发
地执行。
持久性(Durability):一个事务成功完成后,它对数据库的改变必须是永久的,即使
出现系统故障也不会对事务有影响。
2.3 事务隔离级别
针对事务隔离,
SQL
标准定义了
4
类隔离级别,包括了一些具体规则,用来限定事务内外的
哪些改变是可见的,哪些是不可见的。下面介绍四种隔离级
:
READ UNCOMMITTED
(读取未提交内容)
在
READ UNCOMMITTED
隔离级别,所有事务都可以“看到”未提交事务的执行结果。读取
未提交数据,也被称之为“脏读”。
READ COMMITTED
(读取提交内容)
大多数数据库系统的默认隔离级是
read committed
。它满足了隔离的早先单定义:一个事务
在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始到提交前,所做的任何
数据改变都是不可见的,除非已经提交。此隔离级别不支持“可重复读”的操作。这意味着
用户运行同一语句两次,看到的结果是不同的。
REPEATABLE READ
(可重读)
REPEATABLE READ
隔离级解决了
READ UNCOMMITTED
隔离级导致的问题。它确保同一事务
的多个实例在并发读取数据时,会“看到同样的”数据行。不过理论上,这会导致另一个棘
手问题:幻读(
Phantom Read
)。简单来说,幻读指当用户读取某一范围的数据行时,另一
个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”
行。数据库存储引擎可以通过多版本并发控制
(Multiversion Concurrency Control)
机制解决了
幻读问题,如
MySQL
的
InnoDB
和
Falcon
。
SERIALIZABLE (
可串行化
)
SERIALIZABLE
是最高级别的隔离级,它通过强制事务排序,使之不可能相互冲突,从而解决
幻读问题。简言之,
SERIALIZABLE
是在每个读的数据行上加锁。在这个级别,可能导致大量
的超时现象和锁竞争现象。数据库应用中很少看到有用户选择这种隔离级。但如果用户的应
用为了数据的稳定性,需要强制减少并发的话,也可以选择这种隔离级。
3. 分布式事务
分布式事务的实现需要保证事务的原子性、一致性、隔离性和持久性,而实现此
ACID
属性
的基本技术思路有:
通过“两阶段提交(
Two-phase Commit
,
2PC
)”协议实现事务的原子性、一致性
和持久性等属性;
隔离性级别的实现通常使用多版本并发控制机制来保证。实现多版本并发控制常用
的方式是“快照隔离(
Snapshot Isolation
)”技术;
评论