mysql事务及其锁机制

mysql事务及其锁机制

1.事务是一条或多条数据库操作语句的组合。四个特性:ACID;原子性;隔离性;一致性;持久性。MySQL 本身不提供事务支持,而是开放了存储引擎接口,由具体的存储引擎来实现,具体来说支持 MySQL 事务的存储引擎就是 InnoDB。存储引擎实现事务的通用方式是基于 redo log 和 undo log。

多版本并发控制(重要):
Mysql的事务存储引擎不是简单实用行加锁机制,而是叫多版本并发控制(MVCC)技术,和行加锁机制关联实用。以便应对更高的并发,当然是以消耗性能作为代价。
每种存储引擎对MVCC的实现方式不同,InnoDB引擎的简单实现方式如下:InnoDB通过为每个数据航增加两个隐含值的方式来实现。这两个隐含值记录了行的创建时间,以及过期时间。每一行存储事件发生时的系统版本号。每一次开始一个新事务时版本号会自动加1,每个事务都会保存开始时的版本号,每个查询根据事务的版本号来查询结果。

2.数据库并发操作会引发的问题:脏读(dirty read);不可重复读(unrepeatable read);幻读(phantom read);第一类丢失更新;第二类丢失更新;

3.SQL 标准中定义了 4 个隔离级别: read uncommited , read commited , repeatable read , serializable 。
Mysql默认的事务隔离级别为repeatable_read。

4.全部的表类型都可以使用锁,但是只有 InnoDB 和 BDB 才有内置的事务功能。使用 begin 开始事务,使用 commit 结束事务,中间可以使用 rollback 回滚事务。在默认情况下, InnoDB 表支持一致读。MySQL 允许利用 set transaction 来设置隔离级别。如果多个事务更新了同一行,就可以通过回滚其中一个事务来解除死锁。

5.事务只用于 insert 和 update语句来更新数据表,不能用于对表结构的更改。执行一条更改表结构或 begin 则会立即提交当前的事务。

6.有两种类型的表级锁:读锁和写锁。读锁是共享锁,支持并发读,写操作被锁。写锁是独占锁,上锁期间其他线程不能读表或写表。所有表类型都支持表级锁,但是 MyISAM 只支持表级锁。

7.如果要支持并发读写,建议采用 InnoDB 表,因为它是采用行级锁,可以获得更多的更新性能。如果mysql数据库引擎选用myisam会对数据存储的稳定性,数据查询的高效性上面有更多优势,但它不支持事务处理,但是如果不是涉及对数据同步要求非常严格的数据操作都建议使用myisam存储引擎。任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。很多时候,可以通过经验来评估什么样的锁对应用程序更合适,不过通常很难说一个锁比别的更好,这全都要依据应用程序来决定,不同的地方可能需要不同的锁。当前 MySQL 已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了, BDB 表支持页级锁, InnoDB 表支持行级锁。

8.MySQL 的表级锁都是写锁优先,而且是采用排队机制,这样不会出现死锁的情况。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁, BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。

9.对于 InnoDB 和 BDB 表, MySQL 只有在指定用 LOCK TABLES 锁表时才使用表级锁。在这两种表中,建议最好不要使用 LOCK TABLES ,因为 InnoDB 自动采用行级锁, BDB 用页级锁来保证事务的隔离。

10.MySQL涉及的数据结构

1)b+树:是一种多路搜索树,b树是二叉搜索树,b+是b树的一种变种,
B+ 树元素自底向上插入,这与二叉树恰好相反。

2)在MYIDIM引擎下,主键索引和辅助索引的数据结构是b+树,
1.叶节点的data域存放的是数据记录的地址
2.在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
3.MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

3)在InnoDB也使用B+Tree作为索引结构,但但具体实现方式却与MyISAM截然不同。
1.第一个重大区别是InnoDB的数据文件本身就是索引文件。
2.第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。

你可能感兴趣的:(mysql)