这种情况都是行业应用特性和数据库自身对应特性决定的。Oracle是付费闭源大型数据库。我们可以理解为大而全的数据库,它可以支持很大的并发,很大的访问量,目前是OLTP联机事务处理过程最好的工具。而Mysql等是开源免费的中小型数据库,还是有很大不同的。下面我们详细看一下:
1、资源占用方面不同
oralce在底层计算资源上,它默认就会占更多资源以保障Oracle的高效并发处理。oracle在启动后,它占用的内存远大于mysql等这些开源数据库。所以,银行等传统行业的核心Oracle数据库一般都会配备并发性能高的小型机来作为基础硬件支撑。一般会采用oracleRAC+DataGuard来实现。
Mysql本身就是针对中小型数据库的,所以默认占用的资源也是较小的。互联网企业是通过以量取胜的方法来满足资源需要。通常采用大量的PC服务器组件集群来实现。
补充一点,oracle默认对事务是完全支持的,而mysql则只有innodb才支持。
2、并发的不同
在银行应用中,我们可以想象到,每天都有很多人对账户进行操作。而且通常都是读写同时进行。从技术上说,大量的写并发会导致写入冲突。为了保障数据的一致性,一次只能有1个会话可以写入。oralce为了保障数据的高并发,采用的行级锁,只锁定SQL语句要写入数据库对应的数据行。这样子就可以保障其他并发用户依然可以写入其他行。这和银行的银行业务是非常吻合的,所以银行还是使用Oracle居多。
而Mysql只有innodb下才有行锁,但该行锁需要通过给索引项加锁来实现,这种innodb行锁主要分为3种:分别是Recordlock(对索引项加锁)、Gaplock(对索引项之间的“间隙”、第一条记录前的“间隙”或最后一条记录后的“间隙”加锁。)、Next-keylock(前两种的组合,对记录及其前面的间隙加锁)。这种行锁意味着,如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。互联网企业在应用开发商也采用微服务架构,尽量将大应用拆分成很多微服务来实现,这样每个微服务的表都很小。这样可以减少锁冲突。
在大量并发读取数据方面,我们同样要保障读取数据的一致性。Oracle通过在undo表空间中构造多版本数据块来实现读一致性,支持serializable的隔离级别,可以实现最高级别的读一致性。每个session查询时,如果对应的数据块发生变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块。这也是银行等传统行业所需要的特性。
而mysql虽然也有undo表空间,但只支持read