事务处理
事务
(
t
r
a
n
s
a
c
t
i
o
n
)
(transaction)
(transaction)指的是一组
S
Q
L
SQL
SQL语句,它们是一个执行单位,且在必要时还可以取消。事务处理是通过使用提交
(
s
u
b
m
i
t
)
(submit)
(submit)和回滚
(
r
o
l
l
b
a
c
k
)
(rollback)
(rollback)功能来实现的。如果某个事务里的所有语句都成功执行,那么可以提交到数据库中永久性地记录下来。如果在事务执行过程中发生了错误,可以通过回滚操作取消该事务。
事务系统通常具有
′
′
A
C
I
D
′
′
''ACID''
′′ACID′′的四种特性,即
A
t
o
m
i
c
Atomic
Atomic(原子性)、
C
o
n
s
i
s
t
e
n
t
Consistent
Consistent(一致性)、
I
s
o
l
a
t
e
d
Isolated
Isolated(独立性)和
D
u
r
a
b
l
e
Durable
Durable(持久性)。
- 原子性。构成事务的所有语句应该是一个独立的逻辑单元,不能只执行其中的一部分。
- 一致性。数据库在事务的执行前后都必须是一致的。
- 独立性。事务之间不应该不想影响,这样事务在并发执行时才会得到与挨个依次执行一样的效果。
- 持久性。当事务执行成功完成时,其影响将被永久性的记录到数据库里。
M y S Q L MySQL MySQL的存储引擎中, I n n o D B InnoDB InnoDB是事务安全的,而 M y I S A M MyISAM MyISAM和 M E M O R Y MEMORY MEMORY则不是。
事务隔离
多个事务同时运行时可能出现的几类问题:
- 脏读 ( d i r t y r e a d ) (dirty\,read) (dirtyread)。指的是,在某个事务所做的修改尚未提交时,其它事务就能看到这些修改。其它事务因此认为这些行已被修改;即使那个对行进行修改的事务后来被回滚,从而导致这些行并未真正的被修改。
- 不可重复读 ( n o n r e p e a t a b l e r e a d ) (nonrepeatable\,read) (nonrepeatableread)。指的是,同一个事务使用同一条 S E L E C T SELECT SELECT语句在每次读取时得到的结果不一样。如果有一个事务两次执行了同一条 S E L E C T SELECT SELECT语句,但另一个事务在这条语句的两次执行期间修改了某些行,那么就会发生这种情况。
- 幻影行 ( p h a n t o m r o w ) (phantom\,row) (phantomrow)。指的是,一个事务突然看到一个以前没看到过得行。假设某个事务在刚执行完一个 S E L E C T SELECT SELECT语句之后,接着另一个事务插入了一个新的行。如果第一个事务再执行同样的一条 S E L E C T SELECT SELECT语句,咋可能会看到这个新增行。
为了解决这些问题, I n n o D B InnoDB InnoDB存储引擎提供了四种隔离级别。这些隔离级别确定了一个事务所做的哪些修改可以被其他与之同时执行的事务所看到。
- READ UNCOMMITTED。它允许某个事务看到其它事务尚未提交的行修改。
- READ COMMITTED。它只允许某个事务看到其它事务已经提交的行修改。
- REPEATABLE READ。如果某个事务两次执行同一条 S E L E C T SELECT SELECT 语句,其结果是可重复的。也就是说,即使有其它事务在同时插入或者修改行,这个事务所看到的结果也是一样的。
- SERIALIZABLE。它与 REPEATABLE READ 很相似,但对事务的隔离更彻底,主要表现在:对于某个事务正在查看的行,只有等到该事务完成才能被其他事务所修改。也就是说,如果某个事务在读取某些行,那么在它完成之前,其他事物都无法对这些行修改。
下面是 I n n o D B InnoDB InnoDB存储引擎对应的关系:
隔离级别 | 脏读 | 不可重复读 | 幻影行 |
---|---|---|---|
READ UNCOMMITTED | 是 | 是 | 是 |
READ COMMITTED | 否 | 是 | 是 |
REPEATABLE READ | 否 | 否 | 否 |
SERIALIZABLE | 否 | 否 | 否 |