开发者学堂课程【高校精品课-厦门大学 -JavaEE 平台技术:事务的隔离级别】学习笔记,与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/80/detail/15919
事务的隔离级别
隔离级别属性,隔离级别在事务并发的三个问题有关。即脏读问题,不可重复读的问题和幻读的问题。
脏读:事物和事物之间的隔离性没做好。例如 a事务在整个的事务过程中间,会去修改数据。b 事物会去读到 a 事务在过程中间所修改的数据。如果a事物最后把它修改的数据改回成原来样的,但是由于b事物读到了 a事物的过程中间的数据。称为b 事物读到了 a的脏数据。
脏读问题其实就是完全没有隔离事物和事物之间。如果隔离了事物的之间的东西,使他不能读到这个事物中间的数据那就会出现第二个问题,叫做不可重复读。假如a 事物的时间比较长,他首先读了一个数据,然后当他读完数据以后,开启了另外
一个并行的事务,叫做b 事务。b 事物会去修改这个数据。
b事物结束了以后会把它的修改的数据值提交上去。a 事物如果在 b事物结束以后再去读数据就会导致他在 b事物开始之前读的数据和b事物开始之后读的两个数据不一样,称之为不可重复读的问题。若要解决不可重复读的问题,最简单的方式就是对数据来进行加锁。例如加一个读锁。a 事务在读取后就对事物进行了读锁,b事务就不可以去修改它,只可以去读它。这就能够保证不可重复读的问题得已解决。
加了读锁就能保证不可重复读问题,但是不能避免幻读的问题。例如 a事务要统计在系统中间所有的商品的总数,它在读取了系统中间所有的商品的数量后把所有的商品都加了一个读锁,但 b事务可以向商品中间去新增一个新的商品。所以如果a事务再去读一遍,有商品的总数时,发现多了一个商品,称之为幻读的问题。
虽然对数据进行了读锁,但不能禁止另一个事务去增加一个新的数据。但要解决这个问题,要做到完全串行,在读数据的时候,不能对这个数据做任何的改动,为了避免上述的这些问题,可以对这个数据库设定事务的隔离级别。在属性中,可以把它设成默认的级别。因为默认的级别实际就是数据库所使用的隔离级别,并且数据库的隔离级别是可以在数据库里单独去设置的。
数据库和数据、事务和事务之间的操作只读到事务提交以后的,数据第二个级别是READ_UNCOMMITED,这是一个最低的级别,这个最低级别是完全没有隔离事务和事物之间。可以读到任何一个其他事物在中间过程所产生的数据,所以它会产生所有的问题。脏读问题不可重复读问题和幻读问题。提高一个级别READ_COMMITED,这样隔离了事物和事物之间的操作,不会读到另外一个事物在
中间过程中间所修改的数据。但它会有不可重复读和幻读的问题。第三个级别是REPEATABLE_READ,怎么读数据都是一样的。
这样的一个操作,是对数据进行了读锁,不能解决幻读问题。最后是 SERIALIZABLE完全串行以后就可以解决脏读、不可重复读和换读的问题。所有问题都解决了,但是会带来更大的问题,即所有的数据的操作都变成串行,若完全没有并行,这样的一个系统是完全不可能使用的。