一、什么是事务?
一个或一组sql语句组成一个执行单元,要么全部执行,要么全部不执行,这便是事务。(事务是由很多条语句组成的,在组成事务语句的最后的一条语句中可以使用commit来执行事务,也可以使用rollback回滚不执行事务)
二、什么是脏读、不可重复读、幻读?(以下只是举例子,并不是定义)
脏读(只查询一次):对于A,B两个Mysql终端来说,A在一个事务中更新了数据库C的数据但是未提交,当B查看数据库的数据时发现数据已经变了,但是当A选择rollback时,其实数据库C的数据并没有变。
不可重复读(查询两次):对于A,B两个Mysql终端来说,A在一个事务中更新了数据库C的数据但是未提交,B查询读的是一种数据,等终端A选择rollback提交后,B再查询读的是另外一种语句,两次查询的结果不一样就是不可重复读。
幻读(只针对于插入数据):对于A,B两个Mysql终端来说,数据库C本来只有两条语句,A终端插入了一条语句后,B通过update更新语句,B发现有三条语句受到了影响,这就是幻读。
三、事务隔离等级是如何解决这些问题的?
事务的四个隔离级别分别是:
1、读取未提交内容(Read Uncommitted);
2、读取提交内容(Read Committed);
3、可重读(Repeatable Read);
4、可串行化(Serializable)。
对于第一个隔离等级,即读取未提交内容。对于A,B两个Mysql终端,当A更新了数据库C的内容,B会查询到更新的内容,故这种等级最差,三种现象都会出现。
对于第二个隔离等级,即读取提交内容。对于A,B两个Mysql终端,当A更新了数据库C的内容但是未提交,B不会查询到更新的内容,故脏读不会出现,但是当A选择commit提交后,B再次查询发现和之前查询的不一样,这便出现了不可重复读。
这种等级会出现不可重复读,幻读。
对于第三个隔离等级,即可重复读。对于A,B两个Mysql终端,当A更新了数据库C的内容但是未提交,B不会查询到更新的内容,等A选择commit提交后,B还是查询不到更新的内容,只有等B终端自己的事务的最后一条语句选择commit提交后,再次查询,才能查到更新的内容,这便解决了不可重复读。但是如果A终端插入了一条语句,B终端通过update想修改语句时,会发现比以往多一条的语句出现了影响,还是有幻读。
对于第四个隔离等级,即可串行化。对于A,B两个Mysql终端,A准备往数据库C插入数据,但是A的插入行为被制止了,只有等B选择commit语句结束后,A才能插入数据,这就解决了幻读。