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(\'OX520\',\'138888888882\') 
INSERT INTO `demo` (name,tel)VALUES(\'OX520\',\'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

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

e904a68bdb11be01878ca1fb3fa1dadb96fd90a7

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

714f6cc51d76d42ad40f908d19a36dc6e85dfaf6

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

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容