## 事务特性 ###### 1. 原子性: 事务作为一个整体被执行,包含在其中的对数据库的操作要么全部都执行,要么都不执行。 ###### 2. 一致性: 指在事务开始之前和事务结束以后,数据不会被破坏,假如A账户给B账户转10块钱,不管成功与否,A和B的总金额是不变的。 ###### 3. 隔离性: 多个事务并发访问时,事务之间是相互隔离的,一个事务不应该被其他事务干扰,多个并发事务之间要相互隔离。。 ###### 4. 持久性: 表示事务完成提交后,该事务对数据库所作的操作更改,将持久地保存在数据库之中。 ## 隔离级别 MySQL是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话(Session)。 ### 未提交读(READ UNCOMMITTED) 脏读 如果一个事务读到了另一个未提交事务修改过的数据,那么这种隔离级别就称之为未提交读(英文名:READ UNCOMMITTED) 脏读违背了现实世界的业务含义,所以这种READ UNCOMMITTED算是十分不安全的一种隔离级别。 ### 已提交读(READ COMMITTED)不可重复读 如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种隔离级别就称之为已提交读(英文名:READ COMMITTED) ### 可重复读(REPEATABLE READ) 在一些业务场景中,一个事务只能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种隔离级别就称之为可重复读(英文名:REPEATABLE READ) ### Read Uncommitted(读未提交): 事务能读到不同事物没有提交(未commit)的数据结果,实际应用比较少,会产生脏读,事务已经读到其他事务未提交的数据,但数据被回滚,称为脏读。 ### Read Committed(读已提交): 事务读取其他事物已经提交的数据,读取到的是最新的数据,所以会出现在同一事务中 select 读取到的数据前后不一致,会出现不可重复读问题,不可重复读问题就是我们在同一个事务中执行完全相同的 select 语句时可能看到不一样的结果。 ### Repeatable Read(可重复读): mysql 默认事物隔离级别,在同一事务中多次读取同样的数据结果是一样的,解决了不可重复读的问题,此级别会出现幻读的问题,即当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的行。 ### Serializable(串行化): 最高的事物隔离级别,串行化强制事物排序阻塞,避免事物冲突,解决了上述所有的问题,它使用了共享锁,执行效率低下,会导致大量的超时和锁切换竞争现象,实际开发应用很少。