MySQL的行锁和表锁

锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(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的原因了。


以上就是今天分享的内容了,如果你觉得对你有帮助,记得点赞收藏哦,以防找不到我!

(以上图片及文字整理于网络,如有侵权联系删除)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值