文章目录
- 1.事务的四大特性
- 1.1原子性
- 1.2一致性
- 1.3隔离性
- 1.4持久性
- 2.并发访问中存在的一些问题
- 2.1丢失更新
- 2.2脏读
- 2.3不可重复读
- 2.4幻读
- 3.隔离级别解决一致性的问题
- 3.1未提交读
- 3.2提交读
- 3.3可重复读
- 3.4可串行化
- 4.不同隔离级别可以解决的问题
1.事务的四大特性
1.1原子性
事务的最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么全部不完成(例如:多条SQL,要么都执行,要么都不执行)
1.2一致性
执行事务的前后,数据要保持一致,业务上,需要有一定的数据一致性,某个业务操作前后数据要保持一致
1.3隔离性
(1)并发访问数据的时候,一个用户的事务不被其他事务所干扰,各并发事务之间的数据库是独立的,不同隔离级别下,可能不一定满足某种场景下的隔离性
(2)不同隔离级别,一个事务修改的数据根据隔离级别的不同,对其他事务可能可见,也可能不可见
1.4持久性
一个事务被提交后,他对数据库中的数据的改变是持久的没及时数据库发生故障也不应该对其有任何影响,事务提交后数据会持久化到硬盘
(1)rollback回滚:内存中执行的回滚不执行
(2)commit提交:内存中修改的操作执行(写入硬盘)
2.并发访问中存在的一些问题
2.1丢失更新
事务1修改数据的操作在事务2修改后就被覆盖了(相当于丢失)
2.2脏读
第一个事务修改数据还未提交,第二个事务就读取了,在第一个事务回滚以后,第二个事务读取的数据就是脏数据
2.3不可重复读
一个事务两次读取数据,中间另一个事务做了修改,第一个事务两次读取的数据就不同
2.4幻读
一个事务两次读取数据,另一个事务做了插入操作,造成第一个事务读取的结果不同
3.隔离级别解决一致性的问题
3.1未提交读
事务中的修改即使没有提交对其他事务也可见(一般不用)
3.2提交读
一个事务只能读取已经提交的事务所做的修改,也就是说一个事务所做的修改在提交前对其他事务不可见(使用的最多)
3.3可重复读
保证在同一个事务中多次读取同一数据的结果是一样的(MySQL默认的隔离级别)
3.4可串行化
强制事务串行执行,多个事务之间互不干扰,不会出现并发一致性问题(性能太差,一般不用)