一、MySQL事务有什么特性?
- 事务:逻辑上 的一组操作,要不全部成功,要不全部失败回滚
- 如果一个数据库,声称支持事务的操作,那么该数据库必须具备四个特性(ACID)
四个特征(ACID):
-
原子性(atomic)
(1)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
(2)因此事务的操作如果成功就必须要完全引用到数据库,如果操作失败则不能对数据库有任何的影响
-
一致性(consistency)
(1)事务必须使数据库,从一个一致性状态变换到另一个一致性状态
(2)例如转账,用户A和用户B余额总共5000,在A和B之间不管如何转账,转几次,事务结束后A和B总数还应该是5000
-
隔离性(isolation)
(1)当多个用户并发访问数据库时,比如操作同一张表,多个并发事务之间要相互被隔离,不能被干扰
(2)对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么T1之后才开始,这样每个
事务都感觉不到有其他事务并发执行 -
持久性(durability)
(1)一个事务一旦成功提交,那么对数据库中的数据改变就是永久性的
(2)事务一旦提示成功处理,即便是在数据库系统遇到故障的情况下,也不会丢失提交事务的操作,必须要将事务完全执行完成
二、事务有哪些隔离级别?MySQL默认隔离级别是什么?
隔离性保证了操作中的事务互不影响,具有四种隔离级别
- 读取未提交内容(Read Uncommitted)
- 读取已提交内容(Read Committed)
- 可重复读(Repeatable Read)
- 可串行化(Serializable)
-
读取未提交内容(Read Uncommitted)
(1)在该隔离级别,所有事务都可以看到事务未提交的执行结果
(2)会产生脏读的情况
-
读取已提交内容(Read Committed)
(1) 一个事务只能看见,事务已经提交所做的改变,避免了脏读出现
(2)会产生不可重复读:同一个事务中,两次读取的结果不一致
-
可重复读(Repeatable Read)
(1) 这是MySQL的默认事务隔离级别
(2)保证一个事务只能读取一个事务提交的数据,还会在第一次读取到数据后,就将这些数据加锁(悲观锁),其他事务无法修改这些数据,因此实现可重复读
(3)这样的事务隔离级别能够防止脏读、不可重复读,但是无法避免幻读
(4) 幻读:当用户读取某一范围的数据时,另一个事务又在该范围内插入了新数据,当用户再次读取该范围时,会发现有新的“幻影”行
-
可串行化(Serializable)
(1)这是花费代价最高,最可靠的事务隔离级别
(2)事务被处理为顺序执行,防止脏读、不可重复度、幻读
(3)它是在每个读、写操作的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争