zoukankan      html  css  js  c++  java
  • 2014/7/27------数据库的隔离性

    演示不同隔离级别下的并发问题

    1.当把事务的隔离级别设置为read uncommitted ,会引发脏读。不可反复读。虚读


    A窗体

    set transaction isolation  level  read uncommitted;

    start transaction;

    select * from account;

    =======这个时候发现aaa的账户是1000元,转到B窗体

    select * from acount where name=='aaa';

    =======发现aaa的账户多了100元。这个时候a窗体读到的数据时b窗体未提交的数据(脏读);


    B窗体

    start transaction;(有这句话。不写commit语句,数据是不会提交到数据库的)

    update account set money=money+100  where name='aaa';

    ------不要提交。转到A窗体查询


    2..当把事务的隔离级别设置为read committed ,会引发不可反复读,虚读,但可避免脏读;

    A窗体

    set transaction isolation  level  read committed;

    start transaction;

    select * from account;

    =======这个时候发现aaa的账户是1000元。转到B窗体

    select * from acount where name=='aaa';

    =======发现aaa的账户多了100元。这个时候a窗体读到了别的事务提交的数据,两次读取到的是不同的数据(不可反复读);

     

    B窗体

    start transaction;

    update account set money=money+100  where name='aaa';

    commit;

    -----转到a窗体


    3.当把事务的隔离级别设置为repeatable read(mysql 默认级别) ,会引发虚读,但可避免脏读,不可反复读。


    A窗体:

    set transaction isolation level repeatable read;

    start transaction ;

    select * from account;

    =======发现有4条记录,转到b窗体

    select * from account;

    ========可能发现有5条记录,这时候发生了a读取到另外一个事务插入的数据(虚读)


    B窗体

    start transaction;

    insert  into acount(name,money) values('ggg',1000);

    commit;

    -------转到a窗体


    4.当把事务的隔离级别设置为Serializable ,会避免全部的问题。

    A窗体:

    set transaction isolation level repeatable read;

    start transaction ;

    select * from account;

    =======发现有4条记录,转到b窗体



    B窗体

    start transaction;

    insert  into acount(name,money) values('ggg',1000);

    -------发现不能插入。仅仅能等待a结束事务才干插入





  • 相关阅读:
    return和yield的区别
    基本装饰器
    javascript实例:两种方式实现tab栏选项卡
    javascript实例:路由的跳转
    javascript实例:点亮灯泡
    标签页QTabWidget
    主窗口QMainWindow和启动画面
    各种对话框
    列表视图QlistView
    拆分窗口QSplitter
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6912119.html
Copyright © 2011-2022 走看看