Mysql数据库事务
数据库事务
事务特性
SQL92标准定义了数据库事务的四个特点:
- 原子性(Atomicity):一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做。
- 一致性(Consistency):事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。
- 隔离性(Isolation):是指数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务的并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。
- 持久性 (Durability) : 是指当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。
数据异常
- 脏读:读到的数据不是此刻的真实数据
- 不可重复读:两次读到的数据不一样
- 幻读:原来没有,现在有了
四种隔离级别
-
读未提交:
允许
脏读
,但不允许更新丢失 (排他写锁) 一个事务已经开始写数据,另一个事务不允许同时进行写操作
但允许其他事务读此行修改后未提交的数据
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
表现:可以读取任何数据,但是如果更新到同一数据上,需要等待另一个事务执行完,有超时异常
-
读提交:(Oracle默认)
允许
不可重复读
,但不允许脏读
(瞬间共享读锁,排他写锁) 读数据的事务允许其他事务访问这行数据
写数据的事务在未提交前禁止其他事务访问这行数据
SET GLOBAL TEANSACTION ISOLATION LEVEL READ COMMTTED
表现:对同一数据更新需要等待,一个事务如果没有COMMIT,任何其它事务无法读取它的中间值。因为只是加了行共享锁,所以此时,还是可以读到一个事务里正在被update的数据。
-
可重复读:(Mysql默认)
禁止
不可重复读
和脏读
,有时会出现幻影数据,innoDB 中此隔离级别不允许幻象读。(共享写锁,排他写锁) 读事务禁止写事务
写事务禁止其他事务
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ
-
序列化:
读也加锁 ,要求事务序列化执行
在序列化隔离中,innodb会对每一个select语句后自动加上lock in share mode.
锁:实际上只有两种
- 共享锁(Shared Lock) 也叫读锁
共享锁表示对数据进行读操作。因此多个事务可以同时为一个对象加共享锁。 - 写锁(Write Lock)也叫排它锁
写锁表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。
锁粒度 | 本连接查询 | 本连接更新 | 其它连接查询 | 其它连接insert | 其它连接update |
---|---|---|---|---|---|
LOCK TABLES 表名 READ; | 可以 | 不可以 | 可以 | 不可以 | 不可以 |
LOCK TABLES 表名 WRITE; | 可以 | 可以 | 不可以 | 不可以 | 不可以 |