一、为什么要有事务?
事务是保证一组数据库操作,要么成功,要么失败。
在mysql中,MyIsam引擎不支持事务,Innodb才支持事务。事务是引擎层实现的。
事务有ACID,原子性、一致性、隔离性、持久性。
二、innodb事务默认隔离级别是什么?
MySQL InnoDB存储引擎默认的事务隔离级别是可重复读
三、事务隔离级别有哪些?
事务隔离级别有:
读未提交:A事务未提交commit时,B事务可以查看到更新的结果。
读已提交:A事务提交后,B事务才可以查看到更新的结果。
可重复读:在commit未处理的情况下,A在A事务在开始时和commit前再去查的数据一致。
串行化:顾名思义,就是A未提交时,B事务必须要等待A执行完才能执行。
四、请简述一下乐观锁和悲观锁
乐观锁:
乐观的认为操作不会冲突,即不上锁,在更新的时候再处理冲突问题。是通过业务逻辑处理。
通常乐观锁是通过version版本号或时间戳处理。
如下面的示例:
id |
title |
version_id |
1 |
标题1 |
0 |
2 |
标题2 |
0 |
事务处理:
事务A |
事务B |
// 获取id=1的数据 Select id, title, version_id From t1 Where id = 1 // 获取的数据为id=1,title=`标题1`,version_id=0 |
// 获取id=1的数据 Select id, title, version_id From t1 Where id = 1 // 获取的数据为id=1,title=`标题1`,version_id=0 |
// 更新数据title=`标题3` Update t1 Set title="标题3",version_id = version_id + 1 Where id = 1 And version_id=0 | |
// 更新数据title=`标题4` Update t1 Set title="标题4" ,version_id = version_id + 1 Where id = 1 And version_id=0 |
如上面例子,只有事务A的Update能处理成功,事务B的Update操作会处理失败。所以就达到一个乐观锁的效果。乐观锁适合读多写少的场景。
悲观锁:
悲观的认为操作都会冲突,所以在每次操作的时候都需要先获取锁才能对数据进行修改。与乐观锁比较,悲观锁比较适合写多读少的场景,因为锁会导致其他的事务都等待。
悲观锁是数据库自己实现了。悲观锁又分为共享锁和排它锁。
五、请简述一下共享锁和排它锁
排他锁又称为写锁,共享锁又称为读锁。
以下简称S锁和X锁:
X锁又分为表锁、行锁,X锁如果没命中索引或者主键索引的话,就是表锁。
X锁当S锁来获取的时候,需要等待X锁解锁之后才能获取到。
S锁当S锁来获取的时候,可以重复的读取,X锁来获取的时候会失败。
通过sql语句 for update来实现。
Select id, title From t1 Where id = 1 For Update