锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所在有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。
MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
MySQL 里面表级别的锁有这几种:
表锁;
元数据锁(MDL);
意向锁;
AUTO-INC 锁;
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。
如何加表锁
给MyISAM表显示加锁,一般是为了一定程度模拟事务操作,实现对某一时间点多个表的一致性读取。例如,有一个订单表orders,其中记录有订单的总金额total,同时还有一个订单明细表order_detail,其中记录有订单每一产品的金额小计subtotal,假设我们需要检查这两个表的金额合计是否相等,可能就需要执行如下两条SQL:
SELECT SUM(total) FROM orders;
SELECT SUM(subtotal) FROM order_detail;
这时,如果不先给这两个表加锁,就可能产生错误的结果,因为第一条语句执行过程中,order_detail表可能已经发生了改变。因此,正确的方法应该是:
LOCK tables orders read local,order_detail read local;
SELECT SUM(total) FROM orders;
SELECT SUM(subtotal) FROM order_detail;
Unlock tables;
行级锁的类型主要有三类:
Record Lock,记录锁,也就是仅仅把一条记录锁上;
Gap Lock,间隙锁,锁定一个范围,但是不包含记录本身;
Next-Key Lock:Record Lock + Gap Lock 的组合,锁定一个范围,并且锁定记录本身。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
行级锁是存储引擎级别的锁,需要存储引擎支持才有效。目前 MyISAM 存储引擎不支持行级锁,而 Innodb 存储引擎则支持行级锁。而全局锁、表级锁,则是 MySQL 层面就支持的锁。
那么什么时候会使用行级锁呢?
当增删改查匹配到索引时,Innodb 会使用行级锁。
如果没有匹配不到索引,那么就会直接使用表级锁。
为什么很多公司都开始放弃 Oracle 而使用 MySQL?
MySQL与Oracle的区别
1. MySQL是开源免费的,Oracle是付费的商业软件
2. Oracle 与 Linux、UNIX、Windows、Mac OS X 和 z/OS 兼容, MySQL除了这些之外还兼容Symbian、BSD 和 AmigaOS。
3. MySQL 仅支持全文和哈希索引。Oracle 除了全文和哈希索引之外还支持位图、基于函数、分区等。
4. Oracle性能比MySQL更好,在数据量较大的情况下,查询、多表join等操作的速度Oracle明显由于MySQL
5. 数据库安全性方面,MySQL使用三个参数来验证用户,即用户名,密码和位置;Oracle使用了许多安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等。
6.SQL语法方面,Oracle的SQL语法与MySQL有很大不同。Oracle为称为PL / SQL的编程语言提供了更大的灵活性。Oracle的SQL * Plus工具提供了比MySQL更多的命令,用于生成报表输出和变量定义。
7. Oracle数据库支持从数据库内部编写,编译和执行的几种编程语言。此外,为了传输数据,Oracle数据库使用XML。MySQL不支持在系统内执行其他语言,也不支持XML。
8.存储上的区别:与Oracle相比,MySQL没有表空间,角色管理,快照,同义词和包以及自动存储管理。
9. Oracle由于是付费软件,当用户遇到问题时Oracle会提供技术支持。MySQL是免费开源软件,有问题需要由自己的内部员工解决
这也就是为什么公司使用放弃 Oracle 而使用 MySQL的原因了。
以上就是今天分享的内容了,如果你觉得对你有帮助,记得点赞收藏哦,以防找不到我!
(以上图片及文字整理于网络,如有侵权联系删除)