事务
- 一:事务概述
1) 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2)当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
事务的四个特性:ACID
1.原子性 aotmic
2.一致性 consistent
3.隔离性 isolaton
4.持久性 duration
- 二:隔离级别
1.隔离级别概述
事务隔离定义了数据库系统中一个操作产生的影响什么时候以哪种方式可以对其他并发操作可见。
即:主要影响的是并发事务之间的可见性
(1)未提交读Read Uncommitted
最低级别的隔离级别:意思就是即使一个更新语句没有提交,但是别的事务可以读到这个改变.这是很不安全的,可能会出现脏读。
(2)读提交 Read Committed
(3)可重复读 Repeatable Read
(4)序列化 Serializable
2.隔离级别修改SQL
(1) 查询mysql数据库系统级别的事务隔离级别
select @@global.tx_isolation
(2)InnoDB会话级别的事务隔离级别
SELECT @@tx_isolation
(3)修改数据库事务隔离级别
SQL SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
3.隔离级别VS读现象(Read phenomena)
举例说明
在表user 中有下列数据
mysql> select * from user; +----+----------+------+ | id | username | age | +----+----------+------+ | 1 | juzy | 20 | +----+----------+------+ 1 row in set (0.00 sec)
1.脏读 dirty reads
当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读(dirty reads)。
2.不可重复读(non-repeatable reads)
在一次事务中,当一行数据获取两遍得到不同的结果表示发生了“不可重复读(non-repeatable read)”.
3.幻读 (phantorm read )
在事务执行过程中,当两个完全相同的查询语句执行得到不同的结果集。这种现象称为“幻影读(phantom read)”
离级别 | 脏读(Dirty Read) | 不可重复读(NonRepeateable Read) | 幻读(Phantom Read) |
未提交读(Read uncommitted) | 可能 | 可能 | 可能 |
已提交读(Read committed) | 不可能 | 可能 | 可能 |
可重复读(Repeatable read) | 不可能 | 不可能 | 可能 |
可序列化(Serializable) | 不可能 | 不可能 | 不可能 |
- 三:隔离级别VS锁
隔离级别 | 写入锁 | 读取锁 | 范围锁 |
未提交读 | |||
已提交读 | YES | ||
可重复读 | YES | YES | |
可序列化 | YES | YES | YES |
参考link:
[1]http://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1
[1]http://zh.wikipedia.org/wiki/%E4%BA%8B%E5%8B%99%E9%9A%94%E9%9B%A2
[2]https://www.byvoid.com/blog/rdbms-isolation-lock-concurrency