数据库的四大特性:
1.原子性
2.一致性
3.隔离性
4.持久性
其中不考虑事务的隔离性会出现下面几种情况:
(1)脏读
在一个事务处理过程里读取了另一个未提交的事务中的数据。
当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
(2)不可重复读
读取了已提交的事务。事务A读取数据后,事务执行更新操作,使A无法再现前一次读取结果。不可重复读包括三种情况:
A)事务A读取某一数据后,事务B对其作了修改,当事务A再次读取该事物时,得到与前一次不同的值。
B)事务A按一定条件从数据库中读取某数据记录后,事务B删除了其中部分记录,当A再次按相同条件读取数据时,发现某些记录神秘的消失了。
C)事务A按一定条件从数据库中读取某数据记录后,事务B插入了一些记录,当A再次按相同条件读取数据时,发现、多了一些记录。
后两种不可重复读,也称为幻影(Phantom Row)现象。
(3)丢失修改
两个事物A与B,读入同一数据并修改,B提交的结果破坏了A提交的结果,导致A的修改丢失。
(4)幻读(由于设置事务隔离级别为:可重复读,而导致)
同一事务中,虽然多次执行相同的查询,查询结果是相同的。但后面的查询结果已经与DB中真正的数据不一致了。在同一事务中多次读取到的数据,不是真实的DB中当前数据,是虚的数据,就像是DB中数据的幻象。
事务的隔离级别:
1.Serializable (串行化):可避免脏读、不可重复读、幻读。
2.Repeatable read (可重复读):可避免脏读、不可重复读。
3.Read committed (读已提交):可避免脏读。
4.Read uncommitted (读未提交):都避免不了
MySQL默认的方式的:可重复读。
七种传播行为:
1.PROPAGATION_REQUIRED:(支持事务)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2.PROPAGATION_SUPPORTS:(支持事务)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。
3.PROPAGATION_MANDATORY:(支持事务)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4.PROPAGATION_REQUIRES_NEW:(支持事务)创建新事务,无论当前存不存在事务,都创建新事务。
5.PROPAGATION_NOT_SUPPORTED:(不支持事务)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER:(不支持事务)以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED:(不支持事务)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。