目录
1、事务的特性
1.1原子性(Atomicity)
同一个事务中的sql,要不全部执行,要么全部不执行,最经典的例子是转账,A转给B,A少钱,B加钱,缺一不可。
1.2一致性(Consistent)
系统从一个正确状态迁移到另一个正确的状态,依赖于开发者决定的状态,比如一支交易从处理中转为成功。
1.3隔离性(Isolate)
不同事务之间如果没有隔离性会造成数据的脏读、幻读、不可重复读等。
1.4持久性(Durable)
执行完事务后对数据完成修改后是永久性的,事务在未执行完成的时候可以有回滚。
2、事务并发的影响
2.1脏读
假如存在事务A和事务B,事务A将张三的年龄从20周岁改为了22周岁,此时事务B查询到了张三为22周岁则把张三标记为 “满足结婚年龄” 的状态,这时,事务A由于异常原因进行了事务的回滚变成了20周岁,但此时事务B已经执行完成,事务B正是由于数据的脏读而改变了一个不该改变的状态。
2.2不可重复读
2.2.1修改
假如存在事务A和事务B,事务A第一次读取张三的年龄为20周岁,此时事务B将张三的年龄从20周岁改成了22周岁,事务A进行第二次查询的时候查询的结果是22周岁,重复读取数据前后不一样。
2.3幻读
2.3.1新增
假如存在事务A和事务B,数据库表中只存在张三一个人的数据,主键id为 “1”,事务A第一次进行查询的时候发现id为“2”的数据不存在,此时事务B插入了一条id为“2”的数据,事务A进行第二次查询的时候发现id为 “2” 的数据存在。
2.3.2删除
假如存在事务A和事务B,数据库表中只存在张三一个人的数据,主键id为 “1”,事务A第一次进行查询的时候发现id为“1”的数据存在,此时事务B将id为“1”的数据删除,事务A进行第二次查询的时候发现id为 “1” 的数据不存在了。
以上两种都是幻读。
3、事务的隔离级别
事务的隔离级别有4种,例子可以查看事务并发的影响
3.1读未提交(Read uncommitted)
未提交的事务之前可以相互读取。
可造成的影响:脏读、不可重复读、脏读。
(1)脏读:由事务的回滚造成,可查看2.1脏读的例子。
(2)不可重复读:两次数据读取数据值不一致,可查看2.2不可重复读的例子。
(3)幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子。
3.2读已提交(Read committed)
只能读取已经提交后的事务,该隔离级别解决了脏读的影响。
可造成的影响:不可重复度、幻读。
不可重复读:两次数据读取数据值不一致,可查看2.2不可重复读的例子。
幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子。
3.3可重复读(Repeatable read)
又称RR读,假设存在事务A和事务B,事务A将会根据事务ID查到数据 “1”,即使此时事务B对该数据进行了新增或者删除操作也不会影响事务A的查询,解决了不可重复读的影响,但是还会出现幻读。
可造成的影响:幻读。
幻读:两次数据读取数据记录数不一致,可查看2.3幻读的例子,在这里强调一下幻读和不可重复读的区别,一个是数据数值不一样,一个是数据记录数不一样。
3.4串行化(Serializable)
数据库最高的隔离级别,该隔离级别事务串行化执行,解决了脏读、不可重复读、幻读的影响。
表1-1展示了数据隔离级别所造成的影响:
数据库隔离级别 | 脏读 | 不可重复读 | 幻读 |
读已提交 | √ | √ | √ |
读未提交 | √ | √ | |
可重复读 | √ | ||
串行化 |