mysql数据库 | 事务特性简述
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务的特点: 要么全部完成, 要么全部失败!
1. 事务的四大特性
1.1 一致性
事务执行后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的,可以理解为事务前后数据库内的逻辑永远是对的;
其他三特性都是为了一致性
1.2 持久性
一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中,即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
redo log 保证了持久性
1.3 原子性
事务是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
undo log 保证了原子性
1.4 隔离性
隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
mvcc和next-lock保证了隔离性
2. 隔离事务
2.1 如果不隔离会出现的问题?
- 脏读: A事务读到B事物未提交的数据
- 不可重复读: 在一个事务范围内多次查询的结果不同, 数据被另一个事务修改并提交了
- 幻读: ( 幻读是多个事务执行时可能发生的现象 ) 假设T1事务将表里所有数据由1改成2 , 同时T2事务插入了一条新数据, T1执行完毕后一刷新发现多了一条没有被更改的, 以为自己出现了幻觉;这就是幻读
总结:
- 幻读 和 不可重复读 都是读取了其他事务已提交的事务
- 解决 不可重复读----> 锁行
- 解决 幻读 -------> 锁表
2.2 四种隔离级别和能解决的问题
- 读未提交( Read Uncommitted ) : select 语句不加锁 可能读到不一样的数据 并发最高 一致性最差
- 读已提交( Read Committed ) : 可避免脏读
( 高并发的情况下 几乎不会使用 如上两种隔离级别 )
-
可重复读 ( Repeatable read ): mysql 默认的隔离级别 可避免脏读 不可重复读
-
串行化( Serializable 隔离级别最高 ): 使用 锁表 的方式, 可避免脏读 不可重复读 幻读 ///但是 并发性最差 一致性最好
总结: 如上隔离级别由低到高, 越高执行效率越低但是越安全