MySQL学习笔记之四:并发控制和事务机制

一、mysql的并发控制

当有多个查询需要同时修改同一个数据,就会产生并发控制的问题。mysql可以在两个层面进行并发控制:服务器层和存储引擎层。

mysql通过加锁实现并发控制:

⑴锁有两类:

读锁:共享锁,即一个读锁不会阻塞其它读锁,多个用户可同时读取同一个资源,而不互相干扰。

写锁:排他锁,即一个写锁会阻塞其它读写锁,在给定时间内,只有一个用户能执行写入。

⑵锁粒度:

表级锁:锁定整张表

行级锁:并发程度更高,但维护较麻烦,会增加系统开销,易产生死锁。行级锁只能在存储引擎级别实现,MyISAM存储引擎不支持行级锁

⑶锁分类:

隐式锁:由存储引擎自动完成

显式锁:用户可手动施加锁(表级锁)

⑷手动加解锁:服务器级别

LOCK TABLES tb_name {READ|WRITE},...;

UNLOCK TABLES;

FLUSH TABLES WITH READ LOCK;   #全局施加读锁

InnoDB存储引擎也支持另外一种显式锁(只锁定挑选出的行):

SELECT ... LOCK IN SHARE MODE;

SELECT ... FOR UPDATE;

二、事务

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit);

设想一个场景,A要向B转账500元,要经过两个步骤:A从自己的账户中减去500元;向B的账户增加500元。显而易见,只完成第一步或者只完成第二步都不合理,这两个步骤必须放入一个事务中,当作一个不可分割的工作单位,要么都执行,要么都不执行。

⑴事务是恢复和并发控制的基本单位,要符合事务的概念,必须通过ACID测试:

原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的

⑵事务的隔离级别:

READ-UNCOMMITTED(读未提交):事务中的修改,即使没有提交,对其它事务也是可见的。事务可以读取未提交的数据,这也称为“脏读”;最低的隔离级别

READ-COMMTTED(读提交):一个事务开始时,只能“看见”已提交的事务所做的修改,因此,再次执行同样的查询,可能得到不一样的结果,称为“不可重复读”。

REPEATABLE-READ(可重读):保证了在同一个事务中多次读取同样记录的结果是一致的,可能引起“幻读”;mysql默认隔离级别

SERIALIZABILE(可串行化):加锁读,即事务请求不到锁就无法读,必须等到其它事务释放锁(提交或回滚)后才行。

⑶查看mysql的隔离级别:SELECT @@global.tx_isolation;

⑷事务的启动、提交和加滚:

启动:START TRANSACTION;

提交:COMMIT;

回滚:ROLLBACK;

保存点:SAVEPOINT identifier;

回滚至某个保存点:ROLLBACK [WORK] TO [SAVEPOINT] identifier;

删除某保存点:RELEASE SAVEPOINT identifier;

⑸MySQL的自动提交功能:SELECT @@GLOBAL.autocommit;

默认是启用的,修改autocommit仅对支持事务的存储引擎产生影响;

自动提交能保证数据及时写入磁盘,但会造成频繁I/O,降低系统性能。

⑹MVCC: 多版本并发控制;通过保存数据在某个时间点的快照实现。无论事务执行多长时间,其看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表、同一时刻看到的数据可能是不一样的。MVCC仅在第二、第三隔离级别下有效;

⑺事务日志:将随机I/O转换为顺序I/O,以提升事务操作效率;事务日志也称为Write-Ahead Logging。

数据从内存->事务日志->数据文件

为减轻磁盘压力,宜将事务日志和数据文件放于不同的磁盘上,事务日志不宜太大;

⑻InnoDB支持事务,而MyISAM不支持

时间: 2024-10-24 13:01:49

MySQL学习笔记之四:并发控制和事务机制的相关文章

MySQL学习笔记十六:锁机制

1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机制,分别为:表级锁,行级锁,页级锁,它们的特性如下所示. 表级锁:实现逻辑较为简单,加锁速度快,开销小,不会发生死锁:但粒度最大,发生锁冲突的几率最大,并发度最小,适用于以查询为主,极少量更新的系统. 行级锁:加锁慢,开销大,会发生死锁:但粒度最小,锁冲突率小,并发度最高,使用于并发查询大,有大量按

mysql学习笔记之四(视图)

视图 通过对视图的操作不仅可以实现查询的简化,而且还会提高安全性 视图: 本质是一种虚拟表,其内容和真实表相似,包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储数据值的形式存在.行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成. 视图使程序员只关心感兴趣的某些特定数据和他们所负责的特定任务.这样程序员只能看到视图所定义的数据而不是视图所引用表中的数据.从而提高了数据库中数据逇安全性. 特点: 1.视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系

MySQL学习笔记-事务相关话题

事务机制 事务(Transaction)是数据库区别于文件系统的重要特性之一.事务会把数据库从一种一致状态转换为另一个种一致状态.在数据库提交工作时,可以确保其要么所有修改都已经保存了,要么所有修改都不保存. InnoDB存储引擎中的事务完全符合ACID的特性. 原子性(atomicity) 原子性是指整个数据库事务是不可分割的工作单位.只有使事务中所有的数据库操作执行都成功,才算整个事务成功.如果事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行

MySQL学习笔记之三 表类型

你能用的数据库引擎取决于MySQL在安装时候是如何被编译的.要添加一个新的引擎,就必须编译MySQL.仅仅为了添加一个特性而编译应用程序的想法对于Windows的开发人员来说可能有点小题大做,得不偿失,但是在Unix的世界里,这已经成为了标准.在缺省的情况下,MySQL支持三个引擎:ISAM.MyISAM和HEAP.另外两种类型InnoDB和Berkley(BDB),也常常可以使用. ISAM ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之初就考虑到数据库被查询的次数远远大于

MySQL学习笔记-锁相关话题

在事务相关话题中,已经提到事务隔离性依靠锁机制实现的.在本篇中围绕着InnoDB与MyISAM锁机制的不同展开,进而描述锁的实现方式,多种锁的概念,以及死锁产生的原因. Mysql常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-level locking): BDB采用页面锁(page-leve locking)或表级锁,默认为页面锁: InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁: 各种锁特点 表级锁(table-level loc

MySql学习笔记(转载)

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操

mysql学习笔记 第四天

mysql引擎: archive(档案)[数据插入以后不能被修改,只读] blackhole[这种写操作是删除数据,读操作是返回空白记录] CSV[在储存数据时以逗号作为数据项之间的分隔符] example[示例(存根)储存引擎] Falcon[用来进行处理事务的储存类型] federated[用来访问远程数据表的储存引擎] InnoDB[具备外键支持功能的事务处理引擎] memory[内存里的数据表] merge[用来管理多个MyISAM数据表构成的数据表集合(merg-myisam)] my

MySQL学习笔记—SQL服务器模式汇总

MySQL学习笔记-SQL服务器模式汇总 MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式.这样每个应用程序可以根据自己的需求来定制服务器的操作模式. 模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查.这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使用MySQL. 你可以用–sql-mode="modes"选项启动mysqld来设置默认SQL模式.如果你想要重设,该值还可以为空(–sql-mode ="&q

第13章 MySQL服务器的状态--高性能MySQL学习笔记

13.1 系统变量 -- 服务器配置变量 MySQL通过SHOW VARIABLES  SQL命令显示许多系统变量. 13.2 状态变量--SHOW STATUS SHOW STATUS 命令会在一个由两列(名称/值)组成的表格里显示服务器状态变量.这些变量都是只读的. SHOW STATUS默认显示会话变量,SHOW GLOBAL STATUS显示全局变量. 也可以从INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATION_SCHEMA.SESSION_STAT