myisam索和innodb索的问题 (更新中……)

这几天在钻究mysql的知识。学到mysql索的那于章节,现学现卖。我现在就把我理解的东东写下来。
myisam
首先,说一下在mysql的引擎中,有两个重要的问题。
MyISAM:它只支持表锁,并不支持行锁和页面锁。
在MyISAM中,用 lock table 来进行锁的设置

lock table myTableName read local #读锁
local table myTableName write #写锁

读锁:
在同一个进程中,它只能执行查询操作,并不能执行修改的操作。(这儿的修改包括 insert、update、delete)。(直到执行了 unlock tables 命令之后)。
而在其他进程中,它只能进行查询的操作。同样,也不能执行修改的操作。(直到前面的进程执行了 unlock tables 命令之后)。

其实, 对于myisam引擎来说,表锁是默认支持的,只是我们在平时操作的时候没有那么多去留意而已。所以,一般情况下,我们也并没用 local table 去对某个表进行表锁。

当然,如果需要对两个表以上的查询(这儿举个简单的例子【订单表,订单明细表】,我们需要查询两个表中总金额是否相等。那么,这个时候,我们可能就需要对两个表进行表锁了。因为如果不这样做,有可能我们在执行查询订单表的时候,订单明细表已经有更新了)

lock tables myorder_table read local , order_item read local

同时,在执行lock table 表锁后。当前进程只能执行它相关表锁的那个表的操作,并不能执行没有表锁的表的操作。当然,其他进程同样也是不能执行修改的操作(只支持查询操作)。

innodb
innodb跟myisam最大的不同就是 innodb它支持事务跟行级锁,这是myisam引擎并没有功能。也正因为如此,innodb才会给大多数的开发者招来喜欢。事务的概念和一些理论知识我在这儿就不多说了。这儿只是给大家讲解下事务的原理。

简单来说,事务有它的四个属性,原子性,一致性,隔离性,永久性。组合起来就是(acid),说白了,就是
一个事务的开始到结束,要么都执行,要么都不执。(A 原子性)
而且,数据的修改必须是一致的(比如说我给你转10W ,我的卡里少了10W,而你的卡里就多了10W)。(C 一致性)
同时,事务跟事务之间是相互独立的,没有说A事务的发生会影响到B事务。(I 隔离性)
最后,一个事务完成后,修改的数据是永久性的,不会因为啥而导致数据丢失,除非这个事务并没发生过。(D 永久性)

当然,事务的并发也会带来几个问题,
更新丢失:后一个更新的会覆盖前一个更新。简单来说就是A先跟新一编文章,之后B再更新,最后就会导致B把A更新的覆盖了,在数据库中只有B更新的记录。
脏读:还是举个例子吧,A事务更新了一编文章,但还没有提交。而B事务刚好也在读取这条数据,那么,此时,B读到就是A还未提交事务之前的数据。
不可重复读:A事务先读取了一条数据,之后B更新了当前的数据并提交,之后A再去读取,会发现跟刚才读取到的数据是不一样的。
幻读:事务A在读取数据,而事务B在插入一条数据并提交。之后A再读取数据的时候会发现比原来多了一条数据。

你可能感兴趣的:(mysql,数据库架构)