数据库事务的四种隔离机制和七种传播行为

MySQL数据库为咱们提供的四种隔离级别:(依次解决脏读、不可重复读、幻读)sql

  ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。数据库

  ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(Mysql默认的方式)session

  ③ Read committed (读已提交):可避免脏读的发生。(Oracle默认的方式)并发

  ④ Read uncommitted (读未提交):最低级别,任何状况都没法保证。(INNODB内部机制)atom

 

数据库事务正常执行的四个特性:事务

ACID属性:ci

 原子性(atomicity):即不可分割,事务要么所有被执行,要么所有不执行it

一致性(consistency):事务的执行使得数据库从一种正确状态转换成另一种正确状态io

隔离性(isolation):在事务正确提交以前,不容许把事务对该数据的改变提供给任何其余事务table

持久性(durability):事务正确提交以后,其结果将永远保存在数据库之中,即便在事务提交以后有了其余故障,事务的处理结果也会获得保存

 

并发下事务产生的问题:

一、脏读:事务A读到了事务B尚未提交的数据;

二、不可重复读:在一个事务里面读取了两次某个数据,读出来的数据不一致;

三、幻读:在一个事务里面的操做中发现了未被操做的数据。

幻读,须要应用使用加锁读来保证。而这个加锁度使用到的机制就是next-key locks。

SELECT * FROM t_bitfly LOCK IN SHARE MODE;

SELECT * FROM t_bitfly FOR UPDATE;(重复读,看到其余事物提交的数据)。


    

不一样的隔离级别在数据库中的加锁策略不同:
    Read uncommitted - 读不须要加锁,写仅仅须要加 行锁。 
    Read committed - 须要加 写锁,读必须等待写事务结束。避免脏读
    Repeatable reads - 须要加 读锁,当有事务在读一行记录,其余写同一行的事务都会阻塞。避免不可重复读。
    Serializable - 须要加 范围锁,当有事务 SELECT 某个范围的数据时,其余访问同一范围的事务都会阻塞。避免幻读。

 

 

 

Oracle数据库中:

Serializable (串行化)级别。

Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

 

在MySQL数据库中查看当前事务的隔离级别:

   select @@tx_isolation;

  在MySQL数据库中设置事务的隔离 级别:

   set  [glogal | session]  transaction isolation level 隔离级别名称;    set tx_isolation=’隔离级别名称;’

 

 

事务传播行为类型

说明

PROPAGATION_REQUIRED

若是当前没有事务,就新建一个事务,若是已经存在一个事务中,加入到这个事务中。这是 最多见的选择。

PROPAGATION_SUPPORTS

支持当前事务,若是当前没有事务,就以非事务方式执行。

PROPAGATION_MANDATORY

使用当前的事务,若是当前没有事务,就抛出异常。

PROPAGATION_REQUIRES_NEW

新建事务,若是当前存在事务,把当前事务挂起。

PROPAGATION_NOT_SUPPORTED

以非事务方式执行操做,若是当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER

以非事务方式执行,若是当前存在事务,则抛出异常。

PROPAGATION_NESTED

若是当前存在事务,则在嵌套事务内执行。若是当前没有事务,则执行与 PROPAGATION_REQUIRED 相似的操做。

相关文章
相关标签/搜索