数据库事务与锁的关系
来源:互联网 发布:朝鲜族美女 知乎 编辑:程序博客网 时间:2024/06/04 18:23
概述:数据库操作具有四个特性:原子性,隔离性,持久性,一致性。当多个线程操作同一个数据的时候根据不同线程或者事务的动作和时机的不同会出现不同的并发问题,比如脏读,不可重读,幻读,丢失更新等。
数据库事务就是具有上述四个特性的一种数据库操作逻辑,而解决不同事务的并发问题的时候就需要根据上述不同的问题设置不同的隔离级别,而不同的隔离级别底层用的就是不同的数据库锁机制,比如行锁,表锁,页锁,悲观锁,乐观锁等
本文主要依据InnoDB引擎来理解四个事务隔离级别,以及脏读、不重复读、幻读的理解。
MySQL InnoDB事务的隔离级别有四级,默认是“可重复读”(REPEATABLE READ)。
· 未提交读(READUNCOMMITTED)。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)。
· 提交读(READCOMMITTED)。本事务读取到的是最新的数据(其他事务提交后的)。问题是,在同一个事务里,前后两次相同的SELECT会读到不同的结果(不重复读)。
· 可重复读(REPEATABLEREAD)。在同一个事务里,SELECT的结果是事务开始时时间点的状态,因此,同样的SELECT操作读到的结果会是一致的。但是,会有幻读现象(稍后解释)。
· 串行化(SERIALIZABLE)。读操作会隐式获取共享锁,可以保证不同事务间的互斥。
四个级别逐渐增强,每个级别解决一个问题。
· 脏读,最容易理解。另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据。
· 不重复读。解决了脏读后,会遇到,同一个事务执行过程中,另外一个事务提交了新数据,因此本事务先后两次读到的数据结果会不一致。
· 幻读。解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,貌似之前读到的数据是“鬼影”一样的幻觉。
事务的四种隔离级别
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别。我们的数据库锁,也是为了构建这些隔离级别存在的。
- 未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
- 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
- 可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
- 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
- 数据库事务与锁的关系
- 数据库事务与锁的关系
- 数据库并发访问、事务与锁的关系
- 数据库并发访问、事务与锁的关系
- 数据库并发访问、事务与锁的关系
- 关系数据库的事务隔离、锁定与并发控制
- 论同步锁范围与数据库事务范围之间的关系
- Cassandra事务与关系型数据库事务有何区别
- 初步理解数据库锁和事务的关系
- 数据库中的事务隔离级别和锁的关系
- 数据库事务与锁
- 数据库事务与锁
- 关系型数据库中的事务的特性
- 关系型数据库的事务隔离级别
- 关系型数据库事务的作用
- SQLserver锁和事务隔离级别的关系与使用
- MYSQL之事务隔离级别与锁的关系
- 数据库事务与JDO事务的对比
- 关于Lua
- arm第二天(环境搭建、LED上)
- HC-06蓝牙模块设置与使用
- 苹果手机不显示图片的解决方法
- 游戏中使用LUA脚本语言的简介
- 数据库事务与锁的关系
- Gson是如何在运行时处理字段的泛型信息
- 11.28 北京,念腾讯暑假,不思则惘吧!
- php--异常处理
- Alibaba-Dexposed Bug框架原理及源码解析
- 江苏省职业健康监护平台数据交换方案
- Centos的yum源更换为国内的阿里云源
- TODO:一不顺眼就换字体Go之代码篇
- Vigenere Decode