• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gaohuan30
博客园    首页    新随笔    联系   管理    订阅  订阅
MySQ事务(事务的隔离级别)

  令人惊讶的是,大部分数据库系统都没有提供真正的隔离性,而是在正确性和性能之间做了妥协。

  ISO 和 ANIS SQL标准制定了四种事务隔离级别的标准,但是很少有数据库厂商遵循这些标准。比如Oracle数据库就不支持Read UNCOMMITTED和REPEATABLE READ 的事务隔离级别。

  SQL标准定义的四种隔离级别为:

    READ UNCOMMITTED

    READ COMMITTED

    REPEATABLE READ

    SERIALIZABLE

  InnoDB存储引擎默认支持的隔离界别是REPEATABLE READ,但是与标准SQL不同的是,InnoDB存储引擎在REPEATABLE READ事务隔离级别下,使用Next-Key Lock锁的算法,因此避免幻读的产生。这与其他数据库系统是不同的。

  隔离级别月低,事务请求的锁越少或保持锁的时间就越少。这就是为什么大多数数据库系统默认的事务隔离级别是 READ COMMITTED

  如果想要在MySQL数据库启动时就设置事务的默认隔离级别,那就需要修改MySQL的配置文件

    [mysqld]    

    transaction-isolation = READ-COMMITTED

  查看当前会话的事务隔离级别,可以使用:

    select @@tx_isolation;

  查看全局的事务隔离级别,可以使用:

    select @@global.tx_isolation;

  设置全局/当前会话的事务隔离级别:

    set [global] tx_isolation = 'read-committed';

  在SERIALIABLE的事务隔离级别,InnoDB存储引擎会对于每个SELECT语句后自动加上LOCK IN SHARE MODE,即为每个读取操作加一个共享锁。因此在这个事务隔离级别下,读占用了锁,对一致性的非锁定读不在予以支持。这时,事务隔离级别SERIALIZABLE符合数据库理论上的要求。

  因为InnoDB存储引擎在REPEATABLE READ隔离级别下就可以达到3· 的隔离,因此一般不在本地事务中使用Serialiable的隔离级别。SERIALIABLE的事务隔离级别主要用于InnoDB存储引擎的分布式事务。

  

posted on 2020-02-17 17:33  gaohuan30  阅读(207)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3