Mysql事务与行级锁介绍

23天前   阅读:207   分类:后端    标签: Mysql

一、事务

哪些引擎支持事务?

MySQL支持事务的存储引擎有InnoDB,MyISAM是支持事务的

事务的四个特点:

原子性:对于数据的操作要么一起执行,要么一起失败

隔离性:在操作的数据这个事务没有执行完成,其他程序无法操作这个数据

一致性:根据MySQL的规则,保证数据执行数量是一致。

持久性:保存在磁盘中

事务开启:BEGIN 或者 START TRANSACTION

事务提交:COMMIT

事务回滚:ROLLBACK

创建数据表:

CREATE TABLE `demo` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) DEFAULT NULL,
 `tel` varchar(12) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `tel` (`tel`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;

测试事务数据:

BEGIN  或者 START TRANSACTION
INSERT INTO `demo` (name,tel)VALUES('简忆博客','138888888882') 
INSERT INTO `demo` (name,tel)VALUES('简忆博客','138888888881') 

COMMIT

ROLLBACK

MySQL查询异常数据,我们可以通过事务执行ROLLBACK进行回滚。

二、行级锁:能锁住具体的某一行数据

2.1、锁机制:

表锁: myisam,早期BDB锁住整个表锁的实现,开销小,加锁的速度快一些

页锁: BDB锁住一页的数据,大概是16kb左右大小的数据折中

行锁: innodb锁住某一行的数据,开销小,加锁的速度快一些

2.1.1、排它锁:不能允许读,也不能写 ,不能与其他锁一起使用

eg:我们新建两个查询窗口,并分别加上排它锁

第一个程序

START TRANSACTION
SELECT * from `demo` WHERE id =1 for update
COMMIT
ROLLBACK

第二个程序

START TRANSACTION
SELECT * from `demo` WHERE id =1 for update
COMMIT
ROLLBACK

执行之后可以发现,第二个程序需要等待第一个程序提交之后才执行

2.1.2、共享锁:可以允许读,但是不能写,可以与共享锁一起使用

eg:我们新建两个查询窗口,并分别加一把共享锁

第一个程序

START TRANSACTION
SELECT * from `demo` WHERE id =1 LOCK IN SHARE MODE

第二个程序

START TRANSACTION
SELECT * from `demo` WHERE id =1 LOCK IN SHARE MODE

说明:在MySQL当中update, delete, insert, alert这些写的操作,默认加上一把排它锁。

一条数据 如果加了排它锁,就不能加其他排它锁,也不能加共享锁而共享锁,可以继续加共享锁;并且可以读取数据。

【腾讯云】爆款云服务器限时体验20元起,更多上云必备产品低至1元

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。http://tpxhm.com/adetail/936.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

文章评论(0)

登录
简忆博客壁纸 头像

简忆博客
勤于学习,乐于分享。

置顶推荐

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码
×