数据库锁原理

标签: 数据库 原理 | 发表时间:2014-12-09 20:23 | 作者:
出处:http://www.iteye.com
1 为什么需要锁
数据库通常有大量的用户在同时操作,所以并发的情况下需要控制对临界资源的操作,数据库通过锁来控制对临界资源的访问,从而保证数据的一致性。例如对于同一个账户,操作之前账户余额为1000,同时开始2个事务,一个事务取款100,一个事务往账户中汇入100,那么2个事务结束后,账户的余额必须还是1000,否则要么银行不干,要么个人不干。
2 锁类型
2.1 共享锁(读锁)
读锁是共享的,互相不阻塞,也就是可以多个客户同时读取同一资源,而不互相干扰。

加锁条件:当执行select时,数据库为这个事务分配一把共享锁,来锁定被查询的数据。

解锁条件:默认情况下,数据被读取之后,数据库立即解锁。例如select * from table中,先锁定第一行,读取后,立即解锁第一行,然后再锁定第二行,这样大大降低锁争用程度。在repeatable read和serializable 这两种事务隔离级别下,共享锁是在事务结束时释放的,serializable对表加锁。

2.2 排它锁(独占锁)(写锁)
写锁是排他的,一个写锁会阻塞其他的读锁和写锁,只有这样才能保证同一时刻,只有一个用户能够写入,并阻止其他用户读取正在写入的同一资源。如果要锁定的数据资源,已经放置了其他的锁,则不能再放置排它锁。

加锁条件:当执行insert update 和delete语句时,数据库会对操纵的资源使用排它锁。

解锁条件:事务结束时解锁。
3.锁原理
锁的基本原理如下:
1.当第一个事务访问数据库资源时,如果执行select语句,则必须先获得共享锁,如果执行insert update和delete时,必须获得排它锁
2.当第二个事务也要访问相同的资源时,如果执行select语句,也必须先获得共享锁,如果执行insert update或者delete,也必须获得共享锁。根据已经放置在资源上的锁类型,来决定第二个事务是应该等待第一个事务释放锁,还是立即获得锁。







4 锁粒度
常见的锁有表锁、 行锁、 页锁、外键锁等。

锁有一定的消耗,主要有:获得锁,检查锁是否已经解除,释放锁等,这些操作都会增加系统的开销。

表锁开销比较小,但是并发性能也较差,行锁并发性能高,但是需要更多锁,数据库系统一般都支持锁的自动升级,例如一个事务中的锁过多的时候,可能会将行锁升级到表锁。

mysql的各个存储引擎根据不同的应用场景采用不同的锁机制,MyISAM存储引擎采用表锁,InnoDB使用行锁。如果执行alert table之类的操作,服务器也会采用表锁,而忽略存储引擎的锁机制。

页锁,某些数据库支持页锁,页锁粒度介于行锁和表锁之间,用于锁定存放数据的页,1页通常含有n个数据行。


外键锁:外键会产生高级别的锁,后面介绍死锁的时候会提到。
5.乐观锁和悲观锁
悲观锁:假设如果不加锁就一定会出现问题。
乐观锁:先假定不会出现并发问题,出现问题后再采取相应的措施。

悲观锁通过select * from tbl for update实现。
乐观锁可以在表中加一个version字段,每次更新的时候都+1,这样如果出现并发,第二次更新的时候version的值已经不再匹配,可以在这时采取相应的措施。
6 死锁
6.1 死锁是如何产生的
同java的死锁一样,都是互相等待对方释放锁,造成了相互阻塞,造成的死锁。

请看下面的表格:




6.2 如何避免死锁
1.修改操作表的顺序
从上面的示例中可以看出,如果调整一下操作表的顺序就可以避免死锁。

2.外键
产生高级别的锁,会阻止其他事务操作或者其他DML操作,如果是因为外键产生的死锁,可以去掉外键约束,由应用来保证数据的完整性,通常生产环境都不建议加外键约束。

3.短事务
缩短事务的执行时间,可以减少锁的持有时间,可以降低死锁的风险。





7 参考资料
http://www.iteye.com/topic/743285
http://www.iteye.com/topic/236271
http://www.iteye.com/topic/170393
http://thrillerzw.iteye.com/blog/1880242
http://cfeers.iteye.com/blog/760992   *
http://blog.sina.com.cn/s/blog_548bd2090100ir7k.html
http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html
http://blog.163.com/qh_odd@126/blog/static/33376057200851625011100/
http://wenku.baidu.com/link?url=kS0uwo_ykqH5PJg7AM39Mf2jrZfOqn7gusgJkf8s2kJShOr-n_9CiykvDqzEIoHxYkokG_XY7keyu6OL-Bn_R4pw3xW1pN0IUNbYxNrdu3q
《精通hibernate》
《高性能MySQL》

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [数据库 原理] 推荐:

数据库锁原理

- - ITeye博客
数据库通常有大量的用户在同时操作,所以并发的情况下需要控制对临界资源的操作,数据库通过锁来控制对临界资源的访问,从而保证数据的一致性. 例如对于同一个账户,操作之前账户余额为1000,同时开始2个事务,一个事务取款100,一个事务往账户中汇入100,那么2个事务结束后,账户的余额必须还是1000,否则要么银行不干,要么个人不干.

事务与数据库恢复原理

- - CSDN博客推荐文章
数据存储的逻辑单位是数据块,数据操作的逻辑单位是事务. 事务是用户定义的一组操作序列,有一条或多条相关SQL语句组成,是数据库应用程序的基本逻辑单位. 事务管理技术主要包括数据库的恢复技术和并发控制技术. 1、 服务器进程捡取该事务的SQL语句,然后检查共享池,查看是否包含该SQL语句的共享SQL区.

数据库索引的实现原理

- - 孟飞阳的博客
说白了,索引问题就是一个查找问题. 二、数据库索引介绍及特点说明. 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据. 索引的实现通常使用B树及其变种B+树. 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法.

Google Spanner原理- 全球级的分布式数据库

- - 我自然
Google Spanner简介. Spanner 是Google的全球级的分布式数据库 (Globally-Distributed Database). Spanner的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数已百计的数据中心,上万亿的行. 更给力的是,除了夸张的扩展性之外,他还能同时通过同步复制和多版本来满足外部一致性,可用性也是很好的.

数据库水平切分的实现原理解析

- - 数据库 - ITeye博客
本文系转载,原文地址: http://lishuaibt.iteye.com/blog/409294. 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题. 对于一个大型的 互联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载. 对于系统的稳定性和扩展性造成了极大的问题.

Android SQLite数据库版本升级原理解析

- - CSDN博客推荐文章
Android使用SQLite数据库保存数据,那数据库版本升级是怎么回事呢,这里说一下. 安装v1.0,假设v1.0版本只有一个account表,这时走继承SQLiteOpenHelper的onCreate,不走onUpgrade. 1、v1.0(直接安装v1.0). 1、v1.0   -->  v2.0              不走onCreate,走onUpgrade.

数据库内核的快照技术实现原理

- - idea's blog
"快照(Snapshot)"是数据库领域非常重要的一个概念, 最初是用于数据备份. 如今, 快照技术已经成为数据库内核(引擎)最核心的技术特性之一. 数据库内核的绝大多数操作, 都依赖于快照, 例如, LevelDB 的每一次读取操作和遍历操作, 其内部都必须创建一个快照, 所以, 对于一个请求量非常大的系统, 数据库内核每秒种就要创建和销毁几十万次快照.

OGG工作原理 - 关系型数据库 - 亿速云

- -
发布时间:2020-08-07 04:46:09来源:ITPUB博客阅读:122作者:白盲丶栏目:. 一.GoldenGate介绍. OGG 是一种基于日志的结构化数据复制软件. OGG 能够实现大量交易数据的实时捕捉,变换和投递,实现源数据库与目标数据库的数据同步,保持最少10ms的数据延迟. (1).Trail文件的生成和删除.

Spring主从数据库的配置和动态数据源切换原理

- - 廖雪峰的官方网站
在大型应用程序中,配置主从数据库并使用读写分离是常见的设计模式. 在Spring应用程序中,要实现读写分离,最好不要对现有代码进行改动,而是在底层透明地支持. Spring内置了一个 AbstractRoutingDataSource,它可以把多个数据源配置成一个Map,然后,根据不同的key返回不同的数据源.

数据库内核的快照技术实现原理 - 吴祖洋的技术博客

- -
"快照(Snapshot)"是数据库领域非常重要的一个概念, 最初是用于数据备份. 如今, 快照技术已经成为数据库内核(引擎)最核心的技术特性之一. 数据库内核的绝大多数操作, 都依赖于快照, 例如,. LevelDB的每一次读取操作和遍历操作, 其内部都必须创建一个快照, 所以, 对于一个请求量非常大的系统, 数据库内核每秒种就要创建和销毁几十万次快照.