你的位置:首页 > Java教程

[Java教程]【spring企业开发实战】事务并发会遇到的几个问题


一、事务并发会遇到的几个问题:

    1)脏读 :两个事务同时操作同一数据,A事务对该数据进行了修改还没提交的时候,B事务访问了该条事务,并且使用了该数据,此时A事务回滚,那么B事务读到的就是脏数据。

      比如事务1,修改了某个数据              事务2,刚好访问了事务1修改后的数据

      此时事务1,回滚了操作                    事务2,读到还是回滚前的数据

    2) 不可重复读 :这种情况发生 在一个事务内多次读同一数据。A事务查询某条数据,该事务未结束时,B事务也访问同一数据并进行了修改。那么在A事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。

    事务1,查询某个数据                   事务2,修改了某个数据,提交

    事务1,再次查询这个数据

    这样事务1两次查询的数据不一样,称为不可重复读

  3)幻读 : 事务A在操作一堆数据的时候,事务B插入了一条数据,A事务再次查询,发现多了一条数据,像是幻觉。与不可重复读类似,不同的是一个是修改,一个是新增或者删除。

Notice:在oracle中不会出现脏读的情况,为了防止读到更改数据(不可重复读),只需要对操作的数据加上“行级锁”,为了防止读取到新增数据( 幻读),必须加上“表级锁”,将整张表锁定!!!

 4)第一类丢失更新 :A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改时失败然后回滚,把B更新的数据也回滚了。(事务撤销造成的撤销丢失)

 

   5)第二类丢失更新:A,B 事务同时操作同一数据,A先对改数据进行了更改,B再次更改并且提交,把B提交的数据给覆盖了。(事务提交造成的覆盖丢失)