事务总结1
事务的四大属性(ACID)
1 原子性(Atomicity)
指事务包含的操作要么都成功,要么都不成功;不成功不能对数据库有任何影响
2 一致性(Consistency)
指事务必须使数据库从一个一致性状态变换到另一个一致性状态;即一个事务执行前后必须处于一致状态
3 隔离性(Isolation)
指当多个用户并发访问数据库时,数据库为每个访问开启一个事务,多个并发事务之间要相互隔离(隔离存在隔离级别)
4 持久性(Durability)
指事务一旦提交,那么对数据库中的数据的改变是永久性的,即使数据库系统遇到故障的情况下也不会丢失提交的数据
SQL 标准规定的四个事务隔离等级(隔离性内容)
隔离等级 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read_Uncommitted(读未提交) | 允许 | 允许 | 允许 |
Read_Committed(读已提交) | 禁止 | 允许 | 允许 |
Repeatable_Read(可重复读) | 禁止 | 禁止 | 允许 |
Serializable(串行化) | 禁止 | 禁止 | 禁止 |
1. Read_Uncommited(读取未提交)
即一个事务过程中可以读取到另一个还未提交的事务的数据。
(1)所有事务都可以看到其他事务的结果,不管事务是否提交
(2) 这个隔离级别基本不用,性能也没比其他级别好多少
(3) 会引发脏读问题,即读到未提交的内容,而这个内容可能再之后回滚了
2. Read_Committed(读已提交)
即一个事务过程可以读到另一个已经提交的事务的数据(常用)
(1) 多数数据的默认隔离级别,但不是mysql的默认级别
(2) 它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3) 这个隔离级别出现的问题是——不可重复读 (但还是会出现幻读)
不可重复读意味着我们再同一个事务中执行两(或多)次同样的select(同一行数据)时可能会得到不一样的结果(因为别的事务可能提交了更新的数据)【当然新增的数据也会读到, 即幻读】
3. Repeatable_Read(可重复读)
(1) Mysql 默认事务隔离级别(但经测试,公司的用的是Read_Committed)
(2) 它可以确保同一事务的多次读取数据时,会得到同样的数据
(3)此级别会出现幻读(不会出现不可重复读):当用户读取某一范围的数据行时,另一个事务又在该范围内插入新行(并提交),当用户再读取该范围数据行是,会出现新增的行
4. Serializable(串行化)
(1) 最高隔离级别, 并发性能也最差
(2) 强制事务排序,一个一个执行,达到解决幻读问题
(3) 这个级别,可能会导致大量的超时现象和所竞争