1、事务的基本概念(ACID):

  A:atomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全失败

  C:consistency(一致性):表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态

  I:isolation(隔离性):事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据

  D:durability(持久性):事务完成后,它对系统的影响是持久性的

2、事务隔离级别(从低到高)

  读取未提交(Read Uncommitted)

  • 这是最低的事务隔离级别,读事务不会阻塞读事务和写事务(读时可读可写),写事务也不会阻塞读事务,写事务会阻塞写事务(写时可读不可写)
  • 写事务不阻塞读事务,可以读取未提交的数据,容易造成脏读问题
  • 脏读解决方案:如果在第一个事务提交前,任何事务不可读取其修改过的值,则可以避免该问题

  读取已提交(Read Committed)

  • 读事务不阻塞读事务和写事务(读时可读可写),写事务阻塞读事务和写事务(写时不可读写)
  • 读事务不阻塞写事务有可能造成不可重复度问题(在同一个事务中再次读取事务时(select操作),所读取的数据和上一次读取的数据结果不一致)【修改update事务发生率高】
  • 不可重复读解决方案:锁住已经查询出来的记录,不让其他事务进行写操作

  可重复读(Repeatable Read)

  • 读事务会阻塞写事务,读事务不会阻塞读事务(读时可读不可写),写事务阻塞读事务和写事务(写时不可读写)
  • 读事务不阻塞读事务(针对的是记录而不是表),可能会造成幻读问题【新增insert/删除delete事务发生率高】
  • 幻读解决方案:解决办法是锁表,不让产生幻读的记录插入和删除,项目中一般不考虑幻读问题

  序列化(Serializable)

  • 此隔离级别是最严格的隔离级别,如果设置成这个隔离级别,那么就不会出现以上所有问题(脏读、不可重复的、幻读)
  • 性能极低,一般不用

3、一般采用读取已提交,配合各种并发访问控制策略来达到并发事务控制的目的。

  hibernate使用(配置hibernate.cfg.xml)

<!-- 制定事务隔离级别:1、2、4、8对应二进制0001、0010、0100、1000,采用位运算。权限控制经常采用二进制位运算 -->
        <property name="hibernate.connection.isolation">2</property>

 

posted on 2020-06-03 21:59  来临  阅读(225)  评论(0编辑  收藏  举报