一、保存数据的持久性:
MySQL:是在数据库更新或者重启,则会丢失数据。
Oracle:把提交的sql操作线写入了在线联机日志文件中,保持到了磁盘上,可以随时恢复。
SqlServer:2014之后,也拥有了完全持久和延迟持久特性。
二、提交方式:
MySQL:默认是自动提交(变量autocommit为ON)。
Oracle:默认不自动提交,需要用户手动提交(commit)。
SqlServer:默认是自动提交,用户可手动停止(KILL)。
三、对事务的支持:
MySQL:在innodb存储引擎的行级锁的情况下才可支持事务。
Oracle:完全支持事务。
SqlServer:在非自动提交时才可支持事务。
四、对并发性的支持:
MySQL:以表级锁(行级锁依赖于表索引)为主,如果一个session的加锁时间过长,会让其他session无法更新此表中的数据,即“悲观并发控制”。
Oracle:使用行级锁,对资源锁定的粒度要小很多,并且不依赖索引,对并发性的支持要好很多,即“乐观并发控制”。
SqlServer:在表、表的分页、索引键以及单独的数据行上支配共享锁、排它锁、以及更新锁,简单地说:读取时用共享锁,修改时用排它锁,更新锁则是共享锁和排他锁的一种混合。
五、复制备份:
MySQL:复制服务器配置简单,但主库出问题时,从库有丢失一定数据的可能。
Oracle:既有推或拉式的传统数据复制,也有dataguard的双机或多机容灾机制,还有成熟的热备工具rman,主库出现问题时,可以自动切换备库到主库,但配置管理较复杂。
SqlServer:仅复制备份是独立于常规SQL Server备份序列的SQL Server备份。通常进行备份会更改数据库并影响其后备份的还原方式。仅用于在不影响数据库总体备份和还原过程的情况下,为特殊目的而进行的备份。
六、逻辑备份:
MySQL:逻辑备份时要锁定数据,才能保证备份的数据是一致的,会影响正常业务。
Oracle:逻辑备份时不锁定数据,且备份的数据是一致。
SqlServer:逻辑备份时要锁定数据,才能保证备份的数据是一致的,会影响正常业务。
七、性能诊断:
MySQL:诊断调优方法较少,主要有慢查询日志。
Oracle:有各种成熟的性能诊断调优工具,能实现很多自动分析、诊断功能。比如awr、addm、sqltrace、tkproof等。
SqlServer:性能检测工具有sql server profiler,性能调优工具有数据库引擎优化顾问。
八、权限与安全:
MySQL:用户与主机有关,更容易被仿冒主机及ip,意义不大。
Oracle:用户和root用户权限彼此分离,权限与安全概念比较传统,表现一般。
SqlServer:本机可用windows验证登录,远程则用SqlServer验证登录(即sa登录)。
九、相关服务:
MySQL:是轻量型数据库,并且免费开源,没有服务恢复数据。
Oracle:是重量型数据库,收费。
SqlServer:是重量型数据库,收费(与Java有合作),也有支持供应商。
总结:
MySQL优点:(支持5000万条记录的数据仓库;适应于所有的平台;开源软件,版本更新较快;性能很出色,因为它包含一个缺省桌面格式MyISAM。MyISAM 数据库与磁盘非常地兼容而不占用过多的CPU和内存)体积小、速度快、总体拥有成本低,开放源码,搭配“L(Linux)A(Apache)M(MySQL)P(PHP/Perl/Python)“或“LN(Nginx)MP”就可以建立起一个稳定、免费的网站系统,适合中小型网站。MySQL数据库被广泛地应用在Internet上的中小型网站中。MySQL数据库体积小、速度快、总体拥有成本低、开放源码。
MySQL缺点:缺乏一些存储程序的功能,不支持陌生的关键字,采用缺省的端口IP(也是优点),容易被黑客侵入。MyISAM(MySQL的默认存储引擎,另一个是innoDB)并不支持事务处理。
Oracle优点:使用方便、功能强大,可靠性好、安全性好、可移植性好、适应高吞吐量,适用于各类大、中、小、微机环境。ORACLE数据库适用于业务逻辑较复杂、数据量大的较大型项目开发。
Oracle缺点:对硬件要求很高;价格比较昂贵;管理维护麻烦;操作比较复杂,需要技术含量高。
SqlServer优点:图形化用户界面,丰富的编程接口工具,与Windows NT完全集成,支持分布式的分区视图,适用于Win的Web技术的开发。SQL Server数据库的功能比较全面、效率高,适用于中型企业或单位的数据库平台。扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展;可维护性强:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作;安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性;易用性:对应用来说完全透明,集群暴露出来的就是一个IP;
SqlServer缺点:只能在Windows系统下运行;不能够按照Web服务器的处理能力分配负载;负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。
拓展:
数据库引擎的选择:
MYISAM:支持3中存储方式:静态型,动态型,压缩型。
优点:占用的空间小,存储的速度快。
缺点:不支持事务和并发。
innoDB:
优点:提供事务的支持,回滚,崩溃恢复能力,多版本事务并发控制。
缺点:读写效率较差,占用的数据库空间较大。
如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
Memory:内存中对数据创建表,数据全部存储在内存
优点:读写速度非常快,对数据的安全性要求比较低的时候可以选择memory
缺点:生命周期短
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
如果只有insert和select操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive,存历史数据,图书馆的资料等
数据库引擎的对比:
ISAM:ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错;如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。
MyISAM:MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。
InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL+API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。
MEMORY: MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。
ACID概述:
事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性,通常称为事务的ACID属性。
1、原子性(Actomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。(Undo Log实现)
2、一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态(Redo Log实现)
3、隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。
4、持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。(binlog实现)
并发事务带来的问题:
相对于串行处理来说,并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量,从而可以支持更多用户的并发操作,但与此同时,会带来一下问题:
- 脏读:
一个事务正在对一条记录做修改,在这个事务并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做“脏读”
- 不可重复读:
一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”。
- 幻读:
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。
注意:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。
上述出现的问题都是数据库读一致性的问题,可以通过事务的隔离机制来进行保证。
数据库的事务隔离越严格,并发副作用就越小,但付出的代价也就越大,因为事务隔离本质上就是使事务在一定程度上串行化,需要根据具体的业务需求来决定使用哪种隔离级别。
InnoDB是如何在RR条件下解决幻读的
InnoDB在RR条件下解决幻读有两种手段:mvcc(多版本控制)+ 范围锁
1. MVCC
对于快照读来说,幻读的解决是依赖mvcc解决
每次开启事务后都会递增创建一个版本号(version),之后的增删查改都是基于这个版本号进行操作的
SELECT (version)
读取创建版本小于或等于当前事务版本号,并且删除版本为空或大于当前事务版本号的记录。这样可以保证在读取之前记录是存在的。version >= createVersion and version < deleteVersion
INSERT (createVersion)
将当前事务的版本号保存至行的创建版本号。 createVersion = version
UPDATE (createVersion)
新插入一行,并以当前事务的版本号作为新行的创建版本号,同时将原记录行的删除版本号设置为当前事务版本号。 新行createVersion = version,旧行deleteVersion = version
DELETE (deleteVersion)
将当前事务的版本号保存至行的删除版本号。 deleteVersion = version
2. 间隙锁
对于当前读则依赖于间隙锁解决
mysql的间隙锁是基于索引的,对于唯一索引innode会把间隙锁降级为行锁,非唯一索引的话就需要用到间隙锁(也叫范围锁)。
标签:事务,版本号,数据库,mysql,sqlserver,MySQL,oracle,数据,备份 From: https://blog.csdn.net/2401_83691559/article/details/145118675