TRANSACTION(事务隔离级别)数据库
在说明事务隔离级别以前先说一下脏读、不可重复读、幻读这三个概念。并发
脏读:一个事务读取到另外一事务未提交的更新新据。当一个事务正在访问数据,而且对数据进行了修改,而这种修改尚未
提交到数据库中,这时,另一个事务也访问这个数据,而后使用了这个数据。由于这个数据是尚未提交的数据, 那么另
外一个事务读到的这个数据是脏数据,依据脏数据所作的操做也多是不正确的。spa
不可重复读:在同一事务中,屡次读取同一数据返回的结果有所不一样。换句话说就是,后续读取能够读到另外一事务已提交的
更新数据。相反,“可重复读”在同一事务中屡次读取数据时,可以保证所读数据同样,也就是,后续读取不能读到另外一事务
已提交的更新数据。code
幻读:事务T1执行一次查询,而后事务T2新插入一行记录,这行记录刚好能够知足T1所使用的查询的条件。而后T1又使用相同
的查询再次对表进行检索,可是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,由于对T1来讲这一行就像忽然
出现的同样。blog
1. ISOLATION_DEFAULT:这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。
每种数据库的默认隔离级别是不一样的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。
另外四个与JDBC的隔离级别相对应,不一样的隔离级别采用不一样的锁类型来实现,在四种隔离级别中,Serializable的
隔离级别最高,Read Uncommited的隔离级别最低。事务
2. ISOLATION_READ_UNCOMMITTED:读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许一个事务能够
读到另外一个事务未提交的更新数据。(会出现脏读,不可重复读和幻读)it
3. ISOLATION_READ_COMMITTED:读已提交数据,保证在并发的事务中,一个事务修改的数据提交后才能被另一个事
务读取到。(会出现不可重复读和幻读)io
4. ISOLATION_REPEATABLE_READ:可重复读,这种事务隔离级别能够防止脏读,不可重复读。可是可能出现幻读。通常
是采用“快照”的方式来实现的。table
5. ISOLATION_SERIALIZABLE:事务被处理为顺序执行。这是花费最高,但也是最可靠的事务隔离级别。能有效的避免脏读、
不可重复读、幻读。class
PROPAGATION(事务传播属性)
PROPAGATION_REQUIRED:支持当前事务,若是当前没有事务,就新建一个事务。也就是说业务方法须要在一个事务中运行,若是
业务方法被调用时,调用业务方法的行为(方法)已经处在一个事务中,那么就加入到该事务,不然为本身建立一个新的事务。
(默认传播属性)
PROPAGATION_SUPPORTS:支持当前事务,若是当前没有事务,就以非事务方式执行。也就是说若是业务方法在某个事务范围内被调用,
则该方法成为该事务的一部分。若是业务方法在事务范围外被调用,则该方法在没有事务的环境下执行。
PROPAGATION_MANDATORY:支持当前事务,若是当前没有事务,就抛出异常。也就是说业务方法只能在一个已经存在的事务中执行,
业务方法不能发起本身的事务。若是业务方法在没有事务的环境下被调用,容器就会抛出例外。
PROPAGATION_REQUIRESNEW:新建事务,若是当前存在事务,把当前事务挂起。也就是说业务方法被调用时,无论是否已经存在事务,
业务方法总会为本身发起一个新的事务。若是调用业务方法的行为(方法)已经运行在一个事务中,则原有事务会被挂起,新的事务
会被建立,直到业务方法执行结束,新事务才算结束,原先的事务才会恢复执行。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行,若是当前存在事务,就把当前事务挂起。也就是说业务方法不须要事务。若是
方法没有被关联到一个事务中,容器不会为它开启事务。若是方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,
原先的事务便会恢复执行。
PROPAGATION_NEVER:以非事务方式执行,若是当前存在事务,则抛出异常。也就是说业务方法绝对不能在事务范围内执行。若是业务
方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。
PROPAGATION_NESTED:若是一个活动的事务存在,则运行在一个嵌套的事务中。 若是没有活动事务, 则按REQUIRED属性执行。
它使用了一个单独的事务, 这个事务拥有多个能够回滚的保存点。内部事务的回滚不会对外部事务形成影响。它只对
DataSourceTransactionManager事务管理器起效。
数据库事务的4个特性:
原子性(Atomic):组成一个事务的多个数据库操做是一个不可分割的原子单元;只有全部操做执行成功,整个事务才提交,
其中一个操做失败,都必须回滚到初始状态。
一致性(Consistency):事务操做成功后数据库所处的状态和它的业务规则是一致的;(即数据总额不会被破坏。
如A帐户转帐100到B帐户,不管操做成功与否,A和B的存款总额是不变的)
隔离性(Isolation):在并发数据操做时,不一样的事务拥有各自的数据空间,它们的操做不会对彼此产生干扰。(并不是是彻底无干扰,
根据数据库的隔离级别,会产生不一样程度的干扰)
持久性(Durability):一旦事务提交成功,事务中的数据操做都必须持久化到数据库中;就算数据库崩溃,也必须保证有某种机制恢复。
在这些特性中,数据“一致性”是最终目标,其余的特性都是为了达到这个目标的措施和手段。
MYSQL查看当前事务隔离级别
select @@tx_isolation,@@global.tx_isolation;