校园二级网站建设,了解龙岗网站建设,沈阳建网站 哪家好,佛山市住房与城乡建设局网站事务
一、MySQL事务的概念 事务是一种机制、一个操作序列#xff0c;包含了一组数据库操作命令#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作请求#xff0c;即这一组数据库命令要么都执行#xff0c;要么都不执行。
事务是一个不可分割的工作逻辑单…事务
一、MySQL事务的概念 事务是一种机制、一个操作序列包含了一组数据库操作命令并且把所有的命令作为一个整体一起向系统提交或撤销操作请求即这一组数据库命令要么都执行要么都不执行。
事务是一个不可分割的工作逻辑单元在数据库系统上执行并发操作时事务是最小的控制单元。
事务适用于多用户同时操作的数据库系统的场景如银行、保险公司及证券交易系统等等。
事务是通过事务的整体性以保证数据的一致性。
二、事务的ACID特点
ACID是指在可靠数据库管理系统DBMS中事务(transaction)应该具有的四个特性原子性Atomicity、一致性Consistency、隔离性Isolation、持久性Durability。这是可靠数据库所应具备的几个特性。
1、原子性 指事务是一个不可再分割的工作单位事务中的操作要么都发生要么都不发生。
事务是一个完整的操作事务的各元素是不可分的。 事务中的所有元素必须作为一个整体提交或回滚。 如果事务中的任何元素失败则整个事务将失败。2、一致性 指在事务开始之前和事务结束以后数据库的完整性约束没有被破坏。
当事务完成时数据必须处于一致状态。 在事务开始前数据库中存储的数据处于一致状态。 在正在进行的事务中数据可能处于不一致的状态。 当事务成功完成时数据必须再次回到已知的一致状态。3、隔离性 指在并发环境中当不同的事务同时操纵相同的数据时每个事务都有各自的完整数据空间。
对数据进行修改的所有并发事务是彼此隔离的表明事务必须是独立的它不应以任何方式依赖于或影响其他事务。 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据或者在另一个使用相同数据的事务结束之后访问这些数据。4、持久性 在事务完成以后该事务所对数据库所作的更改便持久的保存在数据库之中并不会被回滚。
指不管系统是否发生故障事务处理的结果都是永久的。 一旦事务被提交事务的效果会被永久地保留在数据库中。5、事务之间的相互影响 当多个客户端并发地访问同一表时可能出现下面的一致性问题
1脏读(读取未提交数据)脏读指的是读到了其他事务未提交的数据这些数据并不一定最终存在的数据这就是脏读 2不可重复读(前后多次读取数据内容不一致)一个事务内两个相同的查询却返回了不同数据。这是由于查询时系统中其他事务修改的提交而引起的。
3幻读(前后多次读取数据总量不一致)一个事务对一个表中的数据进行了修改这种修改涉及到表中的全部数据行。同时另一个事务也修改这个表中的数据这种修改是向表中插入一行新数据。那么操作前一个事务的用户会发现表中还有没有修改的数据行就好象发生了幻觉一样。 4丢失更新两个事务同时读取同一条记录A先修改记录B也修改记录B不知道A修改过B提交数据后B的修改结果覆盖了A的修改结果。
三、Mysql及事务隔离级别
1、隔离级别 1read uncommitted读取尚未提交的数据 不解决脏读 允许脏读其他事务只要修改了数据未提交就可以被读到即使未提交本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数居。
2read committed提交读读取已经提交的数据 可以解决脏读 只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别〈不重复读)。
3repeatable read可重复度重读读取可以解决脏读 和 不可重复读 —mysql默认的 可重复读。无论其他事务是否修改并提交了数据在这个事务中看到的数据值始终不受其他事务影响
4serializable串行化可以解决 脏读 不可重复读 和 虚读—相当于锁表 完全串行化的读每次读都需要获得表级共享锁读写相互都会阻塞。 mysql默认的事务处理级别是 repeatable read 而Oracle和SQL Server是 read committed 。
2、事务隔离级别的作用范围 全局级:对所有的会话有效 会话级:只对当前的会话有效
3、隔离级别设置 #1、查询全局事务隔离级别 show global variables like %isolation%; select global.tx_isolation; #2、查询会话事务隔离级别 show session variables like %isolation%; select session.tx_isolation; select tx_isolation; #3、设置全局事务隔离级别 set global transaction isolation level read committed; #4、设置会话事务隔离级别 set session transaction isolation level read committed; 四、事务控制语句 BEGIN 或 START TRANSACTION显式地开启一个事务。 COMMIT 或 COMMIT WORK提交事务并使已对数据库进行的所有修改变为永久性的。 ROLLBACK 或 ROLLBACK WORK回滚会结束用户的事务并撤销正在进行的所有未提交的修改。 SAVEPOINT S1使用 SAVEPOINT 允许在事务中创建一个回滚点一个事务中可以有多个 SAVEPOINT“S1”代表回滚点名称。 ROLLBACK TO [SAVEPOINT] S1把事务回滚到标记点。 1、创建表 2、测试提交事务 begin; #开启事务 update info set money money - 100 where nameA; select * from info; commit; #提交事务 select * from info; 2、测试回滚事务 begin; #开启事务 update info set money money 100 where nameA; select * from info; rollback; #回滚事务 quit mysql -u root -p use SCHOOL; select * from info; 3、测试多点回滚 begin; #开启事务 update info set money money 100 where nameA; select * from info; SAVEPOINT S1; #创建回滚点1 update info set money money 100 where nameB; select * from info; SAVEPOINT S2; #创建回滚点2 insert into info values(3,C,1000); select * from info; ROLLBACK TO S1; #回滚到回滚点1 select * from info; 4、使用 set 设置控制事务 SET AUTOCOMMIT0; #禁止自动提交 SET AUTOCOMMIT1; #开启自动提交Mysql默认为1 SHOW VARIABLES LIKE AUTOCOMMIT; #查看Mysql中的AUTOCOMMIT值 如果没有开启自动提交当前会话连接的mysql的所有操作都会当成一个事务直到你输入rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。 如果开起了自动提交mysql会把每个sql语句当成一个事务然后自动的commit。 当然无论开启与否begin; commit|rollback; 都是独立的事务。
存储引擎一、存储引擎的概念
MySQL中的数据用各种不同的技术存储在文件中每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力这些不同的技术以及配套的功能在MySQL中称为存储引擎。 存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式 MySQL常用的存储引擎MylSAM,InnoDB。 MySQL数据库中的组件负责执行实际的数据I/O操作。 MySQL系统中存储引擎处于文件系统之上在数据保存到数据文件之前会传输到存储引擎之后按照各个存储引擎的存储格式进行存储。 1、Myisam的特点
MyISAM不支持事务也不支持外键约束只支持全文索引数据文件和索引文件是分开保存的
访问速度快对事务完整性没有要求 MyISAM 适合查询、插入为主的应用场景
MyISAM在磁盘上存储成三个文件文件名和表名都相同但是扩展名分别为
.frm 文件存储表结构的定义 数据文件的扩展名为 .MYD (MYData) 索引文件的扩展名是 .MYI (MYIndex)
表级锁定形式数据在更新时锁定整个表 数据库在读写过程中相互阻塞: 会在数据写入的过程阻塞用户数据的读取 也会在数据读取的过程中阻塞用户的数据写入 数据单独写入或读取速度过程较快且占用资源相对少
2、Myisam表支持 3 种不同的存储格式1静态(固定长度)表 静态表是默认的存储格式。静态表中的字段都是非可变字段这样每个记录都是固定长度的这种存储方式的优点是存储非常迅速容易缓存出现故障容易恢复缺点是占用的空间通常比动态表多。2动态表 动态表包含可变字段记录不是固定长度的这样存储的优点是占用空间较少但是频繁的更新、删除记录会产生碎片需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能并且出现故障的时候恢复相对比较困难。3 压缩表 压缩表由 myisamchk 工具创建占据非常小的空间因为每条记录都是被单独压缩的所以只有非常小的访问开支。
3、MyISAM适用的生产场景 公司业务不需要事务的支持 单方面读取或写入数据比较多的业务 MyISAM存储引擎数据读写都比较频繁场景不适合 使用读写并发访问相对较低的业务 数据修改相对较少的业务 对数据业务一致性要求不是非常高的业务 服务器硬件资源相对比较差 MyIsam适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景
4、innodb 1支持事务支持4个事务隔离级别数据不一致问题 MySQL从5.5.5版本开始默认的存储引擎为 InnoDB 5.5之前默认是myisam 2读写阻塞与事务隔离级别相关 能非常高效的缓存索引和数据 表与主键以簇的方式存储 支持分区、表空间类似oracle数据库 支持外键约束5.5前不支持全文索引5.5后支持全文索引 3对硬件资源要求还是比较高的场合 行级锁定但是全表扫描仍然会是表级锁定如 update table set a1 where user like ‘%lic%’; 4InnoDB 中不保存表的行数 如 select count() from table; 时InnoDB 需要扫描一遍整个表来计 算有多少行但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是当 count()语句包含 where 条件时 MyISAM 也需要扫描整个表。对于自增长的字段InnoDB 中必须包含只有该字段的索引但是在 MyISAM 表中可以和其他字段一起建立组合索引。
清空整个表时InnoDB 是一行一行的删除效率非常慢。Myisam 则会重建表 5、MyISAM和InnoDB的特点 MyISAM 默认表类型它是基于传统的ISAM类型ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写它是存储记录和文件的标准方法。不是事务安全的而且不支持外键如果执行大量的selectinsert MyISAM比较适合。
InnoDB 支持事务安全的引擎支持外键、行锁、事务是他的最大特点。如果有大量的update和insert建议使用InnoDB特别是针对多个并发和QPS较高的情况。注 在MySQL 5.5之前的版本中默认的搜索引擎是MyISAM从MySQL 5.5之后的版本中默认的搜索引擎变更为InnoDB。
6、MyISAM和InnoDB的区别 InnoDB支持事务MyISAM不支持。对于InnoDB每一条SQL语言都默认封装成事务自动提交这样会影响速度所以最好把多条SQL语言放在begin和commit之间组成一个事务 InnoDB支持外键而MyISAM不支持。 InnoDB是聚集索引使用BTree作为索引结构数据文件是和主键索引绑在一起的表数据文件本身就是按BTree组织的一个索引结构必须要有主键通过主键索引效率很高。MyISAM是非聚集索引也是使用BTree作为索引结构索引和数据文件是分离的索引保存的是数据文件的指针。主键索引和辅助索引是独立的。 InnoDB不保存表的具体行数执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数执行上述语句时只需要读出该变量即可速度很快。 Innodb不支持全文索引而MyISAM支持全文索引查询效率上MyISAM要高5.7以后的InnoDB支持全文索引了。 InnoDB支持表、行级锁(默认)而MyISAM支持表级锁。 InnoDB表必须有主键用户没有指定的话会自己找或生产一个主键而Myisam可以没有。 Innodb存储文件有frm、ibd而Myisam是frm、MYD、MYI。 Innodbfrm是表定义文件ibd是数据文件。 Myisamfrm是表定义文件myd是数据文件myi是索引文件。二、查看修改存储引擎 #查看系统支持的存储引擎 show engines; #查看表使用的存储引擎 方法一 show table status from 库名 where name表名\G 例show table status from kgc where nameky30\G; 方法二 use 库名; show create table 表名; 例use kgc; show create table ky30;
#修改存储引擎 #方法一通过 alter table 修改 use 库名; alter table 表名 engineMyISAM; #方法二通过修改 /etc/my.cnf 配置文件指定默认存储引擎并重启服务 quit vim /etc/my.cnf [mysqld] default-storage-engineINNODB systemctl restart mysqld.service #修改完记得重启mysql服务 #注意此方法只对修改了配置文件并重启mysql服务后新创建的表有效已经存在的表不会有变更。 #方法三通过 create table 创建表时指定存储引擎 use 库名; create table 表名(字段1 数据类型,...) engineMyISAM;
方法一修改方式修改存储引擎 方法二只针对新建表有效已存在的表不会更改
修改/etc/my.cnf配置文件 方法三创建表直接定义存储引擎类型