`

事务隔离级别

阅读更多
在JDBC操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别的概念。
   问题的提出 :数据库是要被广大客户所共享访问的,那么在数据库操作过程中很可能出现以下几种不确定情况。
  ● 更新丢失(Lost update):两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
  ● 脏读(Dirty Reads):一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。
  ● 不可重复读(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如,在两次读取的中途,有另外一个事务对该行数据进行了修改,并提交。
  ● 两次更新问题(Second lost updates problem):无法重复读取的特例。有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交。这就会造成第一次写操作失效。
  ● 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。
  解决方案:为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
  ● 未授权读取,也称为读未提交(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
  ● 授权读取,也称为读提交(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
  ● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
  ● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
  隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


理解spring管理的事务

hibernate与spring集成后,是由spring来管理事务的。spring提供了声明式事务管理、注解式事务管事等多种事务管理方法。

理解spring管理的事务,要理解两个概念:
1 事务的传播属性
2 数据库的隔离级别


1、Hibernate:
   a、在我们执行一条sql语句:
         insert into a(id ,name) valus(1,'张三');
    假于该语句是在数据库中直接执行,那么可以立刻将该条记录插于数据库。
     但此时我们是在程序中执行该语句的,精确的将是在java语言中执行该sql语句。
java语言不能直接连接数据库,我们是通过jdbc连接数据库的
        1,jdbc连接数据库默认是不立即将数据插入数据库,只用当你commit后才将数据插入数据库;
        2,根据1所以在程序中我们要认为的执行commit ,这样数据才真正插于数据,同时如果一个方法里面有多条sql语句,其中一条出现错误,那么久需要回滚了。

    从上面可以看出来在java程序中人为控制事物是一件很繁琐的事情。同理,hiberante也是这样,执行完成sql语句后需要提交commit。

  此时我们就会想,可不可有个工具自动帮我们管理事物?

2.spring:
  由于人为控制hibernate事物很繁琐,所以我们将事物交给了spring统一管理。但是spring也不是万能的,你要告诉他们不同的方法,该使用这样的事物
如是出现了:save,del,update等开头的方法使用一个事物,以:query,select,get等开发的方法又使用的一个事物。

大概意识就这样,想详细了解 事件,先了解数据库事务,再根据你系统需要那个级别的事务,来具体设置程序的事务级别!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics