一、问题读取
1. 脏读(Dirty Read):
事务1更新了某一条记录,但未提交;事务2读取到新的未提交记录;事务1回滚。
2. 不可重复读取(Nonrepeatable Read):
不可重复读,是指在数据库访问中,一个
事务
范围内两个相同的查询却返回了不同数据。
例子:
事务1读取某一条记录;事务2修改事务1读取的记录提交后;事务1再次读取该记录。
3. 幻象读取(Phantom Read):事务1按 WHERE 子句读取一批记录;事务2插入一条或多条符合事务1读取规则的记录;事务1再按一样的 WHERE 子句读取一批记录。
二、隔离级别(级别由低到高)
1. READ UNCOMMITTED
(读取未提交内容)
2. READ COMMITED
(读取提交内容)
3. REPEATABLE READ
(可重读)
4. SERIALIZABLE
(可串行化)
隔离级别
|
脏读
|
不可重复读
|
幻读
|
Read Uncommitted
|
√
|
√
|
√
|
Read Committed
|
×
|
√
|
√
|
Repeatable Read
|
×
|
×
|
√
|
Serializable
|
×
|
×
|
×
|
三、事务控制语句
查看当前会话隔离级别
|
select @@tx_isolation;
|
查看系统当前隔离级别
|
select @@global.tx_isolation;
|
设置当前会话隔离级别
|
set session transaction isolatin level repeatable read;
|
设置系统当前隔离级别
|
set global transaction isolation level repeatable read;
|
命令行,开始事务时
|
set autocommit=off 或者 start transaction
|
四、事务的特性(ACID)
原子性
(atomicity)
|
原子性是指
一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
只有使事务中所有的数据库操作执行都成功,才算整个事务成功。只要有一个
sql
语句执行失败,那么在这个事务中已经执行的
sql
语句都必须撤销,数据库状态应该退回到执行事务前的状态。
|
一致性
(consistency)
|
事务必须是使
数据库
从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
在事务开始之前和结束之后,数据库的完整性约束没有被破坏。
|
隔离性
(isolation)
|
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。
|
持久性
(durability)
|
持续性也称永久性(
permanence
),指一个事务一旦提交,它对
数据库
中数据的改变就应该是永久性的。接下来的其他操作或故障(比如说宕机等)不应该对其有任何影响。
|