关于MySQL的一些概念
事务:指作为单个逻辑工作单元执行的一系列操作,在我的理解中就是完成一个功能中涉及到的每一步操作的集合。最终这些操作要么全都成功,要么全都失败。
例如:A向B转账500.可分为两部操作:
1,A的账号减500;
2,B的账户加500
只有两步都成功了,才能提交事务,本次操作才算成功,如果任何一步操作出现问题则都回滚到未执行的状态。
四大特性(ACID):
- 原子性(Atomicity ):一个事务的最终结果,要么成功,要么失败
- 一致性(Consistency ):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态,就是保证一个事务中关于数据库的每个操作都能成功执行
- 隔离性(Isolation ): 各个事务对各自数据的操作互相独立,互不影响
- 持续性(Durability ):一个事务提交过后,其执行结果是永久生效的
四大隔离级别
- 读未提交:一个事务可以读取另一个事务未提交的事务,即一个事务的每一步操作都可能对另一个事务的查询结果造成影响。
会产生的问题:脏读,不可重复读,幻读 - 读已提交:只有事务提交后,另一个事务才会读取最新结果
会产生的问题:不可重复读,幻读 - 可重复读:MySQL默认的隔离级别,两次事务查询的结果是相同的
会产生的问题:幻读 - 可串行化:一个事务必须等上一个事务提交过后才能操作,相当于锁表。虽然可以避免问题的产生,但太过影响效率
可能会出现的问题
- 脏读:一个事务在改变数据库的数据但还没提交的时候,另一个事务读取或者使用了该数据。
- 不可重复读:一个事务在执行期间进行了两次查询操作,在这两次操作之间,另一个事务修改了这一部分的数据并提交了,这就会造成两次查询的结果不一样。
- 幻读:一个事务在对一部分数据(比如有共性或者对一张表)进行批量修改的时候,另一个事务往这部分数据新插入了一些数据,最终第一个事务的用户发现还有一些数据没有修改。