Spring 系统学习:Spring的事务管理---事务回顾

1、事务:逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。

2、事务的特性:

  原子性:事务不可分割;

  一致性:事务执行前后,数据的完整性保持一致;

  隔离性:一个事务的执行不应该受到其他事务的干扰;

  持久性:一旦事务结束,数据就持久化到数据库。

3、如果不考虑隔离性,就会引发的安全性问题,例如:

  读问题:

  (1)、脏读           :一个事务读到了另一个事务正在修改但尚未提交到数据库的数据;

       脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。

  (2)、不可重复读 :是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。

  (3)、虚读、幻读:一个事务读到另一个事务insert到数据库的数据,导致该事务多次查询结果不一致。例如:Transaction1读取满足某种搜索条件的一些行,然后Transaction2插入了符合Transaction1的搜索条件的一个新行。如果Transaction1重新执行产生原来那些行的查询,就会得到不同的行。

  (4)、丢失更新:两个事务都同时更新一行数据,一个事务对数据的更新把另一个事务对数据的更新覆盖了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

4、为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

  Read uncommitted:未提交读,任何读问题都解决不了。

  Read committed:    已提交读,解决脏读,不可重复读和虚读可能发生。(oracle)

  Repeatable read:   重复读,解决脏读和不可重复读,但是虚读有可能发生。(mysql)

  Serializable         :   解决所有读问题。非常安全,但是效率非常低。提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。

  因此,隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

猜你喜欢

转载自www.cnblogs.com/JAVA-STUDYER/p/9202385.html
今日推荐