mysql事务隔离级别及传播机制

/ 数据库 / 没有评论 / 0浏览

#TRANSACTION(事务隔离级别)

在说明事务隔离级别之前先说一下脏读、不可重复读、幻读这三个概念。

脏读

一个事务读取到另一事务未提交的更新新据。当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据, 那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作也可能是不正确的。

不可重复读

在同一事务中,多次读取同一数据返回的结果有所不同。换句话说就是,后续读取可以读到另一事务已提交的更新数据。相反,“可重复读”在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另一事务已提交的更新数据。

幻读

事务T1执行一次查询,然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用的查询的条件。然后T1又使用相同 的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然 出现的一样。

1. ISOLATION_DEFAULT

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。每种数据库的默认隔离级别是不同的,例如SQL Server、Oracle默认Read Commited,MySQL默认Repeatable Read。另外四个与JDBC的隔离级别相对应,不同的隔离级别采用不同的锁类型来实现,在四种隔离级别中,Serializable的隔离级别最高,Read Uncommited的隔离级别最低。

2. ISOLATION_READ_UNCOMMITTED

读未提交数据,这是事务最低的隔离级别,在并发的事务中,它充许一个事务可以读到另一个事务未提交的更新数据。(会出现脏读,不可重复读和幻读)

3. ISOLATION_READ_COMMITTED

读已提交数据,保证在并发的事务中,一个事务修改的数据提交后才能被另外一个事 务读取到。(会出现不可重复读和幻读)

4. ISOLATION_REPEATABLE_READ

可重复读,这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻读。一般是采用“快照”的方式来实现的。

5. ISOLATION_SERIALIZABLE

事务被处理为顺序执行。这是花费最高,但也是最可靠的事务隔离级别。能有效的避免脏读、不可重复读、幻读。

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;