一.事务的基本特征
原子性(atomicity) |
一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚 |
对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性 |
一致性(consistency) |
数据库总数从一个一致性的状态转换到另一个一致性的状态 |
一致性是对数据可见性的约束,保证在一个事务中的多次操作的数据中间状态对其他事务不可见的 |
因为这些中间状态,是一个过渡状态,与事务的开始状态和事务的结束状态是不一致的 |
EP:张三给李四转账100元 |
一致性的含义是其他事务要么看到张三还没有给李四转账的状态,要么张三已经成功转账给李四的状态 |
而对于张三少了100元,李四还没加上100元这个中间状态是不可见的 |
隔离性(isolation) |
一个事务所做的修改在最终提交以前,对其他事务是不可见的 |
持久性(durability) |
一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失 |
二.事务的隔离级别,mysql默认的隔离级别是什么?
读未提交(Read uncommitted) |
一个事务可以读取另一个未提交事务的数据,最低级别,任何情况都无法保证----->造成脏读,不可重复读,虚读 |
读已提交(Read committed) |
一个事务要等另一个事务提交后才能读取数据--->解决脏读,存在不可重复读,虚读 |
可重复读(Repeatable read) |
在开始读取数据(事务开启)时,不再允许修改操作--->解决脏读,不可重复度读,存在虚读 |
串行(Serializable) |
是最高的事务隔离级别,在该级别下,事务串行化顺序执行 |
同时只能执行一个事务,相当于事务的单线程--->解决脏读,不可重复读以及虚读,效率低下,比较耗数据库性能,一般不使用 |
Mysql的默认隔离级别是Repeatable read |
Sql Server,Oracle默认隔离级别是Read committed |
三.说一说脏读、不可重复读、幻读(不考虑隔离性的前提下的数据库并发访问问题)
脏读 |
事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据; |
不可重复读 |
事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交 |
导致事务A多次读取同一数据时,结果因此本事务先后两次读到的数据结果会不一致 |
幻读 |
一个事务读取到了另一个事务已经提交(insert)的数据,导致另一个事务多次查询结果不一致 |
幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性) |
四.隔离级别的模拟操作
①脏读:
②不可重复读
③虚读/幻读