Mysql锁机制
mysql锁机制
mysql中对表级的存储引擎来说是释放死锁的,避免死锁可以这样做到:在任何查询之前先请求锁,并且按照请求的顺序锁表。
Mysql中用于write(写)的表锁的实现机制如下:
如果表没有加锁,那么就加一个写锁。否则的话,将请求放到写锁队列中。
mysql中用于read(读)的表锁的实现机制如下:
如果表没有加锁,那么就加一个读锁。否则的话,将请求放到读锁队列中。
比方说一开始没有锁,我读数据,这时就加一个读锁,这时如果来个写操作,那么就把写操作请求放到写锁队列中。
比方说一开始没有锁,我写操作,这时就加一个写锁,这时如果来个读操作,那么就把读操作请求放到读锁队列中。
当锁释放后,写锁队列中的线程可以用这个锁资源,然后才轮到读锁队列中的线程。
这就是说,如果表里有很多更新操作的话,那么select必须等到所有的更新都完成了之后才能开始。
让select速度尽量快,这可能需要创建一些摘要表。
以下是mysql锁的一些建议:
只要对同一个表没有大量的更新和查询操作混在一起,目前的用户并不是问题。
执行LOCK TABLES来提高速度(很多更新操作放在一个锁中 比没有锁的 很多更新快多了),将数据拆分开到多个表中可能也有帮助。
当mysql碰到由于锁表引起的速度问题时,将表类型转换成InnoDB或BDB可能有助于提高性能。
事务处理和并发性
1.全部的表类型都可以使用锁,但是只有InnoDB和BDB才有内置的事务功能
2.使用begin开始事务,使用commit结束事务,中间可以使用rollback回滚事务。
3.在默认情况下,InnoDB表支持一致读。
SQL标准中定义了4个隔离级别:read uncommited,read commited, repeatable read, serializable.
read uncommited即脏读,一个事务修改了一行,另一个事务也可以读到该行。
如果第一个事务执行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。
read commited即一致读,试图通过只 读取提交的值的方式来解决脏读的问题,但是这又引起了不可重复读取的问题。
一个事务执行一个查询,读取了大量的数据行,在它结束读取之前,另一个事务可能已经完成了对数据行的更改。当第一个事务
再次执行同一个查询,服务器就会返回不同的结果。
repeatable read即可重复读,在一个事务对数据行执行读取或写入操作时锁定了这些数据行。但是这种方式又引发了幻想读的
问题。 因为只能锁定 读取或写入的行,不能阻止另一个事务插入数据,后期执行同样的查询会产生更多的结果。
serializ
相关文档:
Mysql中文乱码问题
之前被mysql中总是出现中文乱码搞得云里雾里,在网上也搜了些相关资料,可结果更让我觉得字符集的转换是相当复杂,甚至有了抵触心理,不过还好在最后搜到几篇经典的文章,经过研读总算明白过来!好文章,不敢独享,现将文章稍作整理与大家分享。
字符集基本概念:
http://home.phpchina.com/space.php ......
Twitter公司一位名叫Ryan King的工程师日前向博客MyNoSQL透露,公司计划从MySQL迁移到Cassandra数据库,因为后者具有更大的弹性、可扩展性和大量的社区网络开源开发人员。
我们有大量的数据,在数据巨大,增长率正在加速的情况下,我们需要一个系统,它可以更为自动化,并高度可靠、可用。Ryan K ......
Beware of MySQL Data Truncation
http://www.mysqlperformanceblog.com/2009/02/07/beware-of-mysql-data-truncation/
比如:有一个表aritcle和另一个表article_comment,关联是article的id
CREATE TABLE `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
......
做项目时由于业务逻辑的需要,必须对数据表的一行或多行加入行锁,举个最简单的例子,图书借阅系统。假设 id=1 的这本书库存为 1 ,但是有 2 个人同时来借这本书,此处的逻辑为
view plaincopy to clipboardprint?
Select restnum from book where id =1 ; ......