总结:要么都成功,要么都失败
(1)原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
(2)一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
(3)隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 脏读
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
事务一命令:修改数据的值
事务二命令:查询这个数据的值
事务一命令提交失败,回滚,数据值并没有改变
这时事务二读取了事务一的未提交数据,出现脏读
- 不可重复读
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。(update对数据进行更新操作)
事务一命令:查询该数据值
事务一命令:查询该数据值
事务一命令:查询该数据值
事务二命令:修改该数据值
事务一命令:查询该数据值(值已经被修改)
事务一命令:查询该数据值(值已经被修改)
- 幻读
在事务A多次读取构成中,事务B对数据进行了新增操作,导致事务A多次读取的数据不一致。
事务一命令:查询一组数据
事务一命令:查询一组数据
事务一命令:查询一组数据
事务一命令:查询一组数据
事务二命令:对这组数据插入数据
事务一命令:查询一组数据(数据增加)
事务一命令:查询一组数据(数据增加)
- 第一类事物丢失:(称为回滚丢失)
第二类事物丢失:(提交覆盖丢失) 对于第一类事物丢失,就是比如A和B同时在执行一个数据,然后B事物已经提交了,然后A事物回滚了,这样B事物的操作就因A事物回滚而丢失了。
事务一:获取数据A;事务二:获取数据A
事务一:A-100;事务二:A+500
事务二:提交事务
事务一:提交失败,状态回滚
A值:1000
-
第二类事物丢失:(提交覆盖丢失)
A和B一起执行一个数据,两个同时取到一个数据,然后B事物首先提交,但是A事物加下来又提交,这样就覆盖了B事物,称为第二类事物丢失,覆盖丢失。
事务一:获取数据A;事务二:获取数据A
事务一:A-100;事务二:A+500
事务二:提交事务
事务一:提交事务
A值:900
MySQL数据库的四种隔离级别:
从低到高开始:
- 未提交读(Read uncommitted)。 (写加锁,读不加锁)
写操作加写锁,读操作不加锁。禁止第一类丢失更新,但是会出现所有其他数据并发问题。
2.提交读(Read committed)。(写加锁,读加锁)
写操作加写锁,读操作加读锁。禁止第一类丢失更新和脏读。
就是你已经开始读了数据,然后一个事物开始写,然后写的事物不提交的话,是不能进行读的事物,避免了脏读。
3.可重复读(Read repeatable)。(写加锁,读加锁)
对于读操作加读锁到事务结束,其他事务的更新操作只能等到事务结束之后进行。和提交 读的区别在于
,提交读的读操作是加读锁到本次读操作结束,可重复读的锁粒度更大。禁止两类丢失更新,禁止脏读和不可 重复度,但是可能出现幻读。
4.序列化(Serializable)。(对表级读 写加锁)
读操作加表级读锁至事务结束。可以禁止幻读。