事务的介绍:
事务是用户定义的一系列执行SQL语言的操作,这些操作要不都完全执行,要么都完全不执行,是一个不可再分的工作执行单元。
事务的四大特性:
-
原子性(Atomicity)
-
一致性(Consistency)
-
隔离性(Isolation)
-
持久性(Durability)
>原子性:
一件事务的每一步要不完全都执行,要不每一步都不执行(失败回滚),它不能只执行其中的某一部操作,它是一个不可再分的工作执行单元。
>一致性:
一件事务执行前后保持一致的状态,不管事务是否成功,事务前到达的一致性的状态,事务后也需要到达另一个一致性的状态。
>隔离性:
一件事务的执行是不会被其他事务所干扰。
>永久性:
事务一旦被提交,对数据库的改变是永久性的,其他操作并不会对其有任何影响。
并发事务的问题:
脏读:一个事务在处理数据时读取了另一个没有提交事务中的数据。
B事务插入某数据但并未提交,A事务查询该数据得到B事务未提交的数据。
不可重复读:一个事务在做多次查询语句的时候返回了不同的结果。
解决脏读后,A事务在查询某数据后,数据库显示没有该数据,此时B事务插入该数A并提交,A事务再次查询该数据,数据库显示该数据,两次返回结果不一样。
幻读:
说法一:一个事务在查询时,查不到该数据,但是插入时却显示有数据。
解决不可重复读后,A事务查询某id,数据库显示没有,此时B事务插入该id并提交,A也插入该id却插不进,查询后依然显示该id没有。
说法二:和不可重复读类似,不可重复读是数据改没改变,幻读是数据存不存在。
A事务查询按照某一条件得到了 N 条数据,此时B事务删除或者增加了 M 条符合该条件的数据,当A事务再次进行查询的时候真实的数据集已经发生了变化,但是A却查询不出来这种变化。
解决并发事务的方法
事务的隔离级别
脏读 不可重复读 幻读
-
读未提交(READ UNCOMMITTED) X X X
-
读已提交(READ COMMITTED) √ X X
-
可重复读(REPEATABLE READ) √ √ X
-
可串行化(SERIALIZABLE) √ √ √