在很多客户一起查询数据表时,如果使客户能最快地查询到数据就是调度和锁定做的工作了。在MySQL中,我们把select操作叫做读,把对数据表修改增加的操作(INSERT,UPDATE,REPLACE...)叫做写。MySQL的基本调度策略可以归纳为以下两条:
写入请求将按它们到达服务器的顺序进行处理;
写操作的优先级要高于读操作。
MyISAM和ISAM数据表的调度策略是在数据表锁的帮助下实现的,在客户程序要访问数据表之前,需获得相应的锁,在完成对数据表的操作后,再释放该锁。锁的管理通常由服务器管理,也可人为地用LOCK TABLES和UNLOCK TABLES命令来申请和释放锁。写操作时,需要申请一个独占性的锁,也就是说在写操作其间,该表只能由写操作的客户使用。读操作时,客户必须申请一个允许其他客户对数据表进行写操作的锁,以确保客户在读的过程中数据表不会发生改变。但读操作锁不是独占的,可有多个读操作同时作用于同一个数据表。
通过一些修饰符可影响调度策略,如LOW_PRIORITY(用于DELETE,INSERT,LOAD DATA,REPLACE,UPDATE语句)、HIGH_PRIORITY(用于SELECT语句)、DELAYED(用于INSERT和REPLACE语句)。它们的作用是这样的:
LOW_PRIORITY会使写操作的优先级降低到读操作以下,也就是说读操作会阻塞该级别的写操作,SELECT的HIGH_PRIORITY有类似的作用。
INSERT语句中的DELAYED修饰会使插入操作被放入一个“延迟插入”队列。并返回状态信息给客户,使客户程序可在新数据行还没插入到数据表之前继续执行后面的操作。如果一直有客户读该数据表,新数据行会一直待在队列中,直到数据表没有读操作时,服务器才会把队列中的数据行真正插入到数据表中。该语句可用在以下场合,在一个有冗长查询的数据表中插入数据,而你又不想被阻塞,你就可发出INSERT DELAYED语句,把插入操作放入服务器“延迟插入”队列,你无需等待就马上可进行接下来的操作。
INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=expression, col_name=expression, ...
当一个数据表里从未进行过删除操作或刚刚对它进行过碎片整理的情况下,用INSERT语句插入的数据行只会被添加到数据表的末尾,而不会插入到数据表的中间位置。这样,对于MyISAM表,MySQL允许在有其它客户正在读操作的时间进行写操作。我们称之这并发插入。要使用该技巧,需注意以下两个问题:
不要在INSERT语句中使用LOW_PRIORITY修饰符。
读操作应用LOCK TABLES ... READ LOCAL而不是用LOCK TABLES ...(本地读锁) READ语句来进行数据表读锁定。LOCAL关键字只对数据表中已存在行进行锁定,不会阻塞新行添加到数据表末尾。
BDB数据表使用页面级操作锁,InnoDB数据表使用数据行级操作锁。所以这两种表的并发性比MyISAM和ISAM数据表这种表级锁的并发性会好很多。其中InnoDB的并发性最好。综上所述,我们可得出以下结论:
MyISAM和ISAM数据表的检索速度最快,但如果在检索和修改操作较多的场合,会出锁竞争的问题,造成等待时间延长。
BDB和InnoDB数据表能在有大量修改操作的环境下提供很好的并发性,从而提供更好的性能。
MyISAM和ISAM数据表由于进行表级锁定,所以不会出现死锁现象,BDB和InnoDB数据表则存在死锁的可能性。
分享到:
相关推荐
查看oracle数据库的连接数以及用户 1、查询oracle的连接数 2、查询oracle的并发连接数 3、查看不同用户的连接数 4、查看所有用户: 5、查看用户或角色系统权限(直接赋值给...查看数据库锁定进程 杀掉锁定进程
ACCESS数据库锁定问题.pdf
MySQL 数据库锁定机制,全揭秘,非常不错的,实践文档
数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则。对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外。MySQL数据库由于其...
对于这样的问题,解决的办法就是keep single sqlite connection,保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。完美解决sqlite的 database locked 或者是 error 5: database ...
对于这样的问题,解决的办法就是keep single sqlite connection,保持单个SqliteOpenHelper实例,同时对所有数据库操作的方法添加synchronized关键字。完美解决sqlite的 database locked 或者是 error 5: database ...
sqlite实质上是将数据写入一个文件,通常情况下,在应用的包名下面都能找到xxx.db的文件,拥有root权限的手机,可以通过adb shell,看到data/data/packagename/databases/xxx.db这样的文件。我们可以得知SQLite是...
温备份:数据库锁定表格(不可写入但可读)的状态下进行备份操作。 2)逻辑备份 对数据库逻辑组件(如:表等数据库对象)的备份 1.以sql语句的形式,把库,表结构,表数据保存下来。 数据库的备份策略 完全备份...
14. 什么是数据库锁定?如何避免常见的锁定问题? 15. 什么是查询优化器?如何优化查询性能? 16. 解释数据库范式和反范式化的概念。 17. 如何处理数据库中的重复数据? 18. 什么是存储过程和触发器?如何使用它们?...
包括Schema 设计,Query 语句的性能优化, MySQL Server 中SQL层和存储引擎层的优化思路,以及MySQL 数据库锁定机制的实现。, 架构篇则以设计一个高可用可扩展的企业级分布式数据库集群环境为目标,分析了多种通过 ...
数据库编程 锁定与解锁 课程目标 了解 —— 锁定和解锁的概念; 掌握 —— 锁定和解锁的设置; 锁定与解锁 MySQL提供了LOCK TABLES语句来锁定当前线程的表,语法格式如下: LOCK TABLES tbl_name [AS alias] {READ ...
SQL Server数据库表锁定原理以及如何解除表的锁定
数据库锁定协议错误 SQLITE_EMPTY = 16; (Internal Only)数据库表为空 SQLITE_SCHEMA = 17; 数据库模式改变 SQLITE_TOOBIG = 18; 对一个表数据行过多 SQLITE_CONSTRAINT = 19; 由于约束冲突而中止 SQLITE_...
本例通过CDaodatabase类的open方法打开一个access数据库,通过gettabledefcount方法获得数据库中的数据表数据
第7章 MySQL数据库锁定机制 7.0 引言 7.1 MySQL锁定机制简介 7.2 各种锁定机制分析 7.3 合理利用锁机制优化MySQL 7.4 小结 第8章 MySQL数据库Query的优化 8.0 引言 8.1 理解MySQL的Query...
锁定机制,使事务相互隔离。 记录机制,保证事务的持久性。即使服务器硬件、操作系统或数据库自身出现故障,也可以在重新启动 时使用事务日志,将所有未完成的事务自动地回滚到系统出现故障的位置。 事务管理特性,...
数据库管理规范 版本号:V1.0 信息科 2017年4月 数据库管理规范 1 规范说明 2 2 维护管理安全规范 2 3设计规范 3 ...并专属备份恢复操作 数据库安装后删除或锁闭不需要使用的数据库账号 数据库管理员账户可以锁定和解锁
第7章 MySQL数据库锁定机制 7.0 引言 7.1 MySQL锁定机制简介 7.2 各种锁定机制分析 7.3 合理利用锁机制优化MySQL 7.4 小结 第8章 MySQL数据库Query的优化 8.0 引言 8.1 理解MySQL的Query Optimizer 8.2 ...