事务相关
1、什么是事务?
事务是一系列的操作,他们要符合ACID特性。
最常见的理解就是:事务中的操作要么全部成功,要么全部失败,但是只是这样还不够的。
2、ACID是什么?
A=Atomicity
原子性,要么全部成功,要么全部失败,不可能只执行一部分操作。
C=Consistency
系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态。
I-Isolation
隔离性:通常来说,一个事务在完全提交之前,对其他事务是不可见的。(有例外情况)
D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果。
3、同时有多个事务在进行会怎么样呢?
多事务的并发进行一般会造成以下几个问题:
脏读:A事务读取到了B事务未提交的内容,而B事务后面进行了回滚。
不可重复读:当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作。
幻读:A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据,造成“幻觉”。
4、怎么解决这些问题呢?MySQL的事务隔离级别了解吗?
MySQL的四种隔离级别如下:
1、未提交读
这就是上面所说的例外情况,这个隔离级别下,其他事务可以看到本事务没有提交的部分修改。因此会造成脏读的问题(读取到
了其他事务未提交的部分,而之后该事务进行了回滚)。
这个级别的性能没有足够大的优势,但是又有很多的问题,因此很少使用。
2、已提交读
其他事务只能读取到本事务已经提交的部分。这个隔离级别有不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟
然不一样,因为另外一个事务对数据进行了修改。
3、可重复读
可重复读隔离级别解决了上面不可重复读的问题,但是仍然有一个新问题,就是 幻读,当你读取 id>10 的数据行时,对涉及到
的所有行加上了读锁,此外另外一个事务新插入了一条 id=11 的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么
进行本事务进行下一次的查询时会发现有一条 id=11 的数据,而上次的查询操作并没有获取到,再进行插入时会有主键冲突的
问题。
4、可串行化
这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所有的操作串行执行,这会导致并发性能急速下降,因此也
不是很常用。
5、InnoDB使用的是哪种隔离级别呢?
InnoDB默认使用的是可重复读隔离级别。
6、对MySQL的锁了解吗?
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他人使用完毕才可以再次使用。
7、MySQL都有哪些锁呢?向上面那样子进行锁定岂不是有点阻碍并发效率了?
从锁的类别上来讲,有共享锁和排他锁。
共享锁:又叫做读锁。当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
排他锁:又