• 关于事务和隔离性的一些随想


    2018-09-30

    昨天面试被问得一脸萌逼。不过回想起来,在这么短时间要高速思考中,居然想通了东西。(当然了,是事后补习了一下知识)。现分享如下:

    事务仅仅是数据插入或修改完整性的一种表述。

    隔离性()仅仅只读的一种表述。

    以前总是把事务性和隔离性混在一起,傻傻分不清。

    可以说事务和隔离性关注的点不同,事务性关注的是操作的一致性,而隔离性是一种读,是一种观察,

    而脏读、不可重复读、幻读都是读到我们不期望的状态(和事务想表达的意思不同),虽然是不期望的,但一般概率比较低,或者说是一瞬间,事务并没有破坏掉,或者说,这些都是在正常事务机制下产生了一种中间态。

    比如脏读,这一秒你读到了,刷新一下,就重现不了了(没有缓存的情况下,纯查询),以后无论刷新多少下,都重现不了,说明事务是有效的,

    你只是读到了一个本不该读到的中间状态。

    不可重复读。当看字面,很难明白。其它它可以翻译为“在同一个事务中,多次读取同一条记录,返回的结果可能不同”。

    过几天我整理一下脏读的demo验证方式。

    2018-10-07

    如果你的数据库设置的是“读未提交”,那你在代码里设置成“读已提交”是不生效的。

    如果你的数据库设置的是“读已提交”,但是你在代码里设置成“读未提交”也是不生效的。

    验证的方法:

    我是用的Navicat,它有一个“命令行界面”,打开它之后,use database_name;选中某一个数据库。(填你自己的数据库名)

    然后set autocommit=off; 取消自动提交。

    SELECT @@global.tx_isolation,  @@tx_isolation,  @@session.tx_isolation;  这个是查看目前的隔离级别

    set global transaction isolation level read committed;//设置全局的隔离级别

    然后你想验证读未提交的话,执行

    start transaction;

    update tb_student set s_name = '013' where s_id = 7;

    一直不输入commit;,这样就一直卡在事务未提交的状态。

    然后你可以用写代码去读数据。就是这样。

    隔离级别常量:

    Read uncommitted

    Read committed

    Repeatable read

    Serializable

  • 相关阅读:
    Code First数据库迁移
    创建静态报表
    JavaScript prototype
    把事务封装成类似Serializable用法的特性
    我的开发框架(WinForm)2
    使用 NPC,NPCManager 在 XNA 中创建 NPC
    ExtJs控件属性配置详细
    Python+Django+Eclipse 在Windows下快速开发自己的网站
    C++ const && 二叉树合集
    验证视图状态 MAC 失败,解决方法
  • 原文地址:https://www.cnblogs.com/angelshelter/p/9728605.html
Copyright © 2020-2023  润新知