如题,下面从四个方面来阐释:mysql
1.事务的隔离级别spring
2.脏读、不可重读读、幻读的理解sql
3.经常使用数据库的默认隔离级别数据库
4.实际项目中的应用并发
1、数据库事务、spring事务的隔离级别:oracle
2、那么什么是脏读、不可重读读、幻读呢?性能
脏读(Dirty Read).net
脏读意味着一个事务读取了另外一个事务未提交的数据,而这个数据是有可能回滚server
不可重复读(Unrepeatable Read)事务
不可重复读意味着,在数据库访问中,一个事务范围内两个相同的查询却返回了不一样数据。这是因为查询时系统中其余事务修改的提交而引发的。
例如:事务B中对某个查询执行两次,当第一次执行完时,事务A对其数据进行了修改。事务B中再次查询时,数据发生了改变
幻读(phantom read)
幻读,是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的所有数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,之后就会发生操做第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉同样.
3、数据库默认的隔离级别
mysql 默认级别是Repeatable read
oracle、sql server 是 Read committed
4、实际项目中咱们应该怎么作 ?
spring 中的Transactional注解提供了隔离级别的设置
一、Isolation.DEFAULT:为数据源的默认隔离级别
二、isolation=Isolation.READ_UNCOMMITTED:未受权读取级别
以操做同一行数据为前提,读事务容许其余读事务和写事务,未提交的写事务禁止其余写事务(但容许其余读事务)。此隔离级别能够防止更新丢失,但不能防止脏读、不可重复读、幻读。此隔离级别能够经过“排他写锁”实现。
三、iIsolation.READ_COMMITTED:受权读取级别
以操做同一行数据为前提,读事务容许其余读事务和写事务,未提交的写事务禁止其余读事务和写事务。此隔离级别能够防止更新丢失、脏读,但不能防止不可重复读、幻读。此隔离级别能够经过“瞬间共享读锁”和“排他写锁”实现。
四、iIsolation.REPEATABLE_READ:可重复读取级别
以操做同一行数据为前提,读事务禁止其余写事务(但容许其余读事务),未提交的写事务禁止其余读事务和写事务。此隔离级别能够防止更新丢失、脏读、不可重复读,但不能防止幻读。此隔离级别能够经过“共享读锁”和“排他写锁”实现。
五、iIsolation.SERIALIZABLE:序列化级别
提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。此隔离级别能够防止更新丢失、脏读、不可重复读、幻读。若是仅仅经过“行级锁”是没法实现事务序列化的,必须经过其余机制保证新插入的数据不会被刚执行查询操做的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,可是对并发性能的影响也越大。对于多数应用程序,能够优先考虑把数据库系统的隔离级别设为Read Committed。它可以避免更新丢失、脏读,并且具备较好的并发性能。尽管它会致使不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,能够由应用程序采用悲观锁或乐观锁来控制。
那么什么是乐观锁和悲观锁,如何使用?
一、悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其余事务,以及来自外部系统的事务处理)修改持保守态度,所以,在整个数据处理过程当中,将数据处于锁定状态。悲观锁的实现,每每依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,不然,即便在本系统中实现了加锁机制,也没法保证外部系
统不会修改数据)。
二、乐观锁( Optimistic Locking )
相对悲观锁而言,乐观锁机制采起了更加宽松的加锁机制。悲观锁大多数状况下依靠数据库的锁机制实现,以保证操做最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销每每没法承受。
而乐观锁机制在必定程度上解决了这个问题。乐观锁,大可能是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增长一个版本标识,在基于数据库表的版本解决方案中,通常是经过为数据库表增长一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,以后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,若是提交的数据版本号大于数据库表当前版本号,则予以更新,不然认为是过时数据。