MySQL事务、引擎总结
Mysql是一种关系型数据库,在java开发中经常使用,它是免费开源的,默认端口号为3306。
事务:事务是一组操作要么都执行要么都不执行。
事务四大特性:(ACID)
1.原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
2.隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
3.一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
4.持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
并发事务带来的问题:
1.修改丢失:两个事务对一个数据进行操作,一个修改的结果覆盖了另一个的修改,第一个事务的修改丢失。
2.脏读:事务获取的值与数据库中不同,读取到了错误的值,即第一个事务在读取时,第二个事务对数据进行了修改,第一个事务读取到了第二个事务修改的值,第二个事务发生了错误回滚了数据,第一个事务取到的值没有得到更改。
3.幻读:一个事务在两次查询中获得的查询结果的记录数不同,第一个事务对数据进行查询,第二个事务对数据的个数进行更改,第一个事务再次查询,两次相同的查询得到的数据记录数不同。
4.不可重复读:一个事务在两次查询中获得不同的查询结果,第一个事务对数据进行查询,第二个事务对数据进行更改,第一个事务再次查询,两次相同的查询得到的数据不同。
幻读和不可重复读的区别在与不可重复读中第二个事务修改的是一条数据中的值,幻读是修改了一组数据中的数据的记录数。
四种隔离级别
1.Read uncommitted(读取未提交数据):一个事务在修改数据时,不允许其他事务修改该数据但允许其他数据读取。这样可以避免更新丢失,但不能避免脏读,幻读,不可重复读。
2.Read committed(读取已提交数据):一个事务进行读操作时允许其他事务对数据进行访问,一个事务进行写操作时不允许其他事务对数据进行访问。在写的时候不允许访问这样可以避免脏读,但不能避免其他。
3..Repeatabl read(可重复读):一个事务对一组数据进行读取时,不允许其他事务对已有的数据进行修改但是允许其他事务增加新插入的记录,这样可以避免脏读,不可重复读,不能避免幻读。
4.Serializable(串行化): 提供严格的事务隔离。它要求事务串行化执行,事务只能一个接着一个地执行,但不能并发执行。可以避免所有问题。
Mysql的默认事务隔离级别是可重复读。
Mysql的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
MySQL中默认的存储引擎为InnDB。
常用存储引擎
1.MyISAM
当使用MyISAM引擎创建数据库时,会产生三个文件,文件的名字为表的名字,扩展名分别为frm其中存放表的定义数据,MYD其中存放表的具体数据,MYI其中存放表的索引。
MyISAM不支持事务,也不支持行级锁和外键。在进行更新表的操作时,MyISAM需要锁定整个表,效率会低一些。
虽然MyISAM不支持事务,但是可以在Service层,自己设计事务进行控制。
MyISAM引擎中读取操作很快,因此如果读操作远远大于其他操作,可以考虑使用MyISAM引擎。
MyISAM中存储了表的行数,所以select * from table,不会进行全表查询,而是会直接读取已经保存好的值。
2.InnoDB
InnoDB为MySQL中默认的存储引擎,它支持事务,默认事务为可重复读,这样InnoDB就拥有了崩溃回滚的能力,更为安全。
InnoDB支持行级锁和外键约束。支持行级锁可以让它在并发中拥有更高的效率。
InnoDB是为处理巨大数据量时的最大性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB没有没有保存表的行数,所以在进行Select * from TableName 时会进行整表查询。
InnoDB会在内存中建立缓冲区,用于缓冲数据和索引。
3.Memory
Memory将数据存在内存中,每个Memory表对应一个磁盘文件,后缀名为frm。
Memory支持的锁粒度为表级锁。支持的数据类型也有限制,不支持BLOB和TEXT类型,只支持固定长度的数据类型。
如果服务器发生故障,数据会丢失。默认使用为hash索引。