首页 数据库 mysql教程 网站建设中数据库锁使用技巧

网站建设中数据库锁使用技巧

Jun 07, 2016 pm 05:37 PM
使用技巧 数据库 网站

无论是网站建设还是任何其它系统项目中使用的数据流,锁是数据库不可分割的一部分,有了数据库锁,数据才能够在允许并发请求存在的同时,还能确保数据库ACID属性中的一致性和隔离性。但是,数据库锁有很多种,甚至连实现它们的方法也有很多种。下表中对各种

    无论是网站建设还是任何其它系统项目中使用的数据流,锁是数据库不可分割的一部分,有了数据库锁,数据才能够在允许并发请求存在的同时,还能确保数据库ACID属性中的一致性和隔离性。但是,数据库锁有很多种,甚至连实现它们的方法也有很多种。下表中对各种开源数据库系统和第三方专有的数据库系统支持的各种锁类型进行了概述。

 

锁类型

说明

隐式锁

是数据库代表请求生成的,用于执行某些事务的锁。通常是必要时为某些DML(数据操作语言)任务完成的。

显示锁

用户在与数据库中的实体交互时定义的锁,有用户自定义。

行锁

可以锁住数据库表中正在被更新,被读或被创建中的一行,防止当前行数据被多个并发请求更改引起数据的不稳定状态。

页锁

可以锁住具有正在被更新的行或行组的分页,只有在数据表分页的表中才存在。

范围锁

通常,这种锁锁住的一组是分页。在添加数据库空间时,这种锁很常见。

表锁

锁住整个表,也就是锁住数据库中的一个实体。

数据库锁

锁住整个数据库中所有的表和关系,这也是数据库中最大范围和最危险的锁,慎用!

         搜索一下,你就会发现各种类型的锁。根据数据库的类型,主关键字和索引锁可以锁住在表上创建的索引。通常网站建设人员还会发现关于锁的讨论,以及不同数据库支持各种锁的方法。据我们对部分深圳网站建设公司的调查和了解,很少公司真的会用到这么多类型的锁,即使数据库支持它们,在行业内也很少会用到。

         虽然锁对数据库实现一致性和隔离性至关重要,但显然一些锁的使用成本很高。这个使用成本是由锁的范围决定的,比如表锁,会将整个数据表锁住,在表被锁住的时间里其他任何对这个表的请求都将被拒绝,这意味着其它用户必须等待,直到这个表的锁被释放出来。因此,锁的使用成本就是整个网站对数据库中被锁数据的使用等待时间,这个等待时间直接影响到了网站用户的使用时间,流畅度和用户体验,因此数据库锁的使用是要以网站建设的用户体验作为代价的。

通常,数据库是允许并发式的数据读取的,但在写数据的过程中会阻止所有的读操作。读操作一般会发生得很快,也在瞬间完成,所以许多读操作可以同时发生,但写操作就通常是在隔离的状态下进行的。写操作的颗粒度越精细,例如只写一行,那么在数据库中甚至在表中能同时发生的写操作就多。提高被写或更新的对象颗粒度,如同时更新多个行,就可能需要提高必要的锁类型,也就是提高锁的作用范围。

在网站建设项目中,,采用的数据库锁的大小或粒度最终会影响事务的吞吐量。如果同时更新数据库中的多个行,那么获得多个锁的成本和对这些行的竞争会造成每秒处理的事务量比只获得更大粒度的锁要少。但如果采用的锁范围太大,例如在只需要更新很少几行数据的情况下采用了页锁,那么在锁定的期间,事务的吞吐量也会降低的。

         通常,网站建设数据库的一个组件决定了采用的粒度,在允许最大并发性的同时,还能确保一致性和隔离性。在大多的情况下,最初采用这个组件决定什么需要被锁住是最好的方案。数据库的这个组件在运行时比网站建设人员更清楚哪些是可能被更新的。遗憾的是,这些系统一定会出错,这就是为什么一定要监控生成环境中的数据库,当从生成环境中了解到发生了什么时,要修改我们的DML使得它们更加有效。

         网站建设中使用的大多数数据库都具有收集性能统计信息的功能,从中我们可以了解到最常见的锁定条件以及造成事务在处理前等待的最常见事件。通过分析历史信息,并且积极地监控生成环境中的事件,我们就能发现某种类型的锁使用得不对,强制性地使数据库采用正确类型的锁。例如,如果通过分析,我们发现数据库总是对某个特定的表使用锁,而我们认为采用行锁会得到更大的并发性,那么就必须强行更改。

         与分析瓶颈同样重要,网站建设人员应该分析是否可以通过修改实体和外键关系来减少争用,提高并发性。数据库的横向扩展是解决这类问题的较好方法,也就是将读操作分布到数据库的多个只读副本上,而只在一个主数据库上进行写操作。当然也可以根据部分的争用问题,将表分布到多个数据库中,这属于数据库的纵向扩展。最后,我们也可以把客户的详细数据分放在多个表中,从而减少表的大小,把争用分布到多个实体上。

         最后,在采用数据库的网站建设项目中,应该确保选中了最佳的解决方案。我们一再对深圳网站建设公司强调,你能用任何技术对几乎任何产品进行扩展。也就是说,我们做的大多数决定会对网站建设项目或产品的上市时间造成影响。例如,有的数据库存储引擎解决方案限制了数据库中可以采用的锁类型,从而就限制了数据库的调优能力,不能最大化并发的事务数了。MySql就是一个例子,如果选择了MyISAM作为存储引擎,就会限制表级的锁,从而可能会限制事务的吞吐量。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Go语言如何实现数据库的增删改查操作? Go语言如何实现数据库的增删改查操作? Mar 27, 2024 pm 09:39 PM

Go语言是一种高效、简洁且易于学习的编程语言,因其在并发编程和网络编程方面的优势而备受开发者青睐。在实际开发中,数据库操作是不可或缺的一部分,本文将介绍如何使用Go语言实现数据库的增删改查操作。在Go语言中,我们通常使用第三方库来操作数据库,比如常用的sql包、gorm等。这里以sql包为例介绍如何实现数据库的增删改查操作。假设我们使用的是MySQL数据库。

Hibernate 如何实现多态映射? Hibernate 如何实现多态映射? Apr 17, 2024 pm 12:09 PM

Hibernate多态映射可映射继承类到数据库,提供以下映射类型:joined-subclass:为子类创建单独表,包含父类所有列。table-per-class:为子类创建单独表,仅包含子类特有列。union-subclass:类似joined-subclass,但父类表联合所有子类列。

iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 iOS 18 新增'已恢复”相册功能 可找回丢失或损坏的照片 Jul 18, 2024 am 05:48 AM

苹果公司最新发布的iOS18、iPadOS18以及macOSSequoia系统为Photos应用增添了一项重要功能,旨在帮助用户轻松恢复因各种原因丢失或损坏的照片和视频。这项新功能在Photos应用的"工具"部分引入了一个名为"已恢复"的相册,当用户设备中存在未纳入其照片库的图片或视频时,该相册将自动显示。"已恢复"相册的出现为因数据库损坏、相机应用未正确保存至照片库或第三方应用管理照片库时照片和视频丢失提供了解决方案。用户只需简单几步

在PHP中使用MySQLi建立数据库连接的详尽教程 在PHP中使用MySQLi建立数据库连接的详尽教程 Jun 04, 2024 pm 01:42 PM

如何在PHP中使用MySQLi建立数据库连接:包含MySQLi扩展(require_once)创建连接函数(functionconnect_to_db)调用连接函数($conn=connect_to_db())执行查询($result=$conn->query())关闭连接($conn->close())

深入解析HTML如何读取数据库 深入解析HTML如何读取数据库 Apr 09, 2024 pm 12:36 PM

HTML无法直接读取数据库,但可以通过JavaScript和AJAX实现。其步骤包括建立数据库连接、发送查询、处理响应和更新页面。本文提供了利用JavaScript、AJAX和PHP来从MySQL数据库读取数据的实战示例,展示了如何在HTML页面中动态显示查询结果。该示例使用XMLHttpRequest建立数据库连接,发送查询并处理响应,从而将数据填充到页面元素中,实现了HTML读取数据库的功能。

如何在PHP中处理数据库连接错误 如何在PHP中处理数据库连接错误 Jun 05, 2024 pm 02:16 PM

PHP中处理数据库连接报错,可以使用以下步骤:使用mysqli_connect_errno()获取错误代码。使用mysqli_connect_error()获取错误消息。通过捕获并记录这些错误信息,可以轻松识别并解决数据库连接问题,确保应用程序的顺畅运行。

PHP处理数据库中文乱码的技巧与实践 PHP处理数据库中文乱码的技巧与实践 Mar 27, 2024 pm 05:21 PM

PHP是一种广泛应用于网站开发的后端编程语言,它具有强大的数据库操作功能,常用于与MySQL等数据库进行交互。然而,由于中文字符编码的复杂性,在处理数据库中文乱码时常常会出现问题。本文将介绍PHP处理数据库中文乱码的技巧与实践,包括常见的乱码原因、解决方法和具体的代码示例。常见的乱码原因数据库字符集设置不正确:数据库在创建时需选择正确的字符集,如utf8或u

如何用 Golang 连接远程数据库? 如何用 Golang 连接远程数据库? Jun 01, 2024 pm 08:31 PM

通过Go标准库database/sql包,可以连接到MySQL、PostgreSQL或SQLite等远程数据库:创建包含数据库连接信息的连接字符串。使用sql.Open()函数打开数据库连接。执行SQL查询和插入操作等数据库操作。使用defer关闭数据库连接以释放资源。

See all articles