一、事务
哪些引擎支持事务?
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这些写的操作,默认加上一把排它锁。
一条数据 如果加了排它锁,就不能加其他排它锁,也不能加共享锁而共享锁,可以继续加共享锁;并且可以读取数据。