zoukankan      html  css  js  c++  java
  • 事务

    一.什么是事务

          事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败;

    二.mysql中的事务

         a.mysql引擎是支持事务的;

         b.mysql默认自动提交事务的,每条语句都处在独立事务中;

         c.手动控制事务

                 开启事务 begin transaction

                 回滚事务 commit

                 结束事务 rollback

    三.事务特性

         原子性   是一个不可分割的工作单位

        一致性    事务必须从一个一致性状态变换到另一个一致性状态, eg:转账 前后总额保持不变

        隔离性    每个用户操作事务,事务之间不会互相干扰

        持久性    事务一旦被提交就就会永远的改变数据库

    四.事务的隔离级别

        脏读:                一个事务读取了另一个事务未提交的数据;

        不可重复读:       在一个事务中读取表中的一行数据时,多次读取结果不一样。一个事务读取了另一个事务提交完的数据(update)

        虚读                 在一个事务中读取到了另一个事务插入的数据,导致多次读取数据结果不一致(insert)

    数据库通过设置事务的隔离级别防止以上情况的发生:

    * 1READ UNCOMMITTED: 赃读、不可重复读、虚读都有可能发生。

          * 2READ COMMITTED: 避免赃读。不可重复读、虚读都有可能发生。(oracle默认的)

          * 4REPEATABLE READ:避免赃读、不可重复读。虚读有可能发生。(mysql默认)

          * 8SERIALIZABLE: 避免赃读、不可重复读、虚读。

            级别越高,性能越低,数据越安全

    mysql中:

       查看当前的事务隔离级别:SELECT @@TX_ISOLATION;

       更改当前的事务隔离级别:SET TRANSACTION ISOLATION LEVEL 四个级别之一。

          设置隔离级别必须在事务之前

    五.编写事务

    时间

    线程1

    线程2

    说明

    t1

    begin;

    t2

    select * from account where name='zs';

    结果1000

    t3

    begin;

    t4

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

    t5

    select * from account where name='zs';

    结果1100

    读到了另一个线程未提交事务的数据。赃读发生了

    t6

    commit;

    t7

    select * from account where name='zs';

    结果1100

    读到了另一个线程提交事务的update数据。不可重复读发生了

    t8

    insert into account values(4,'zl',1000);

    执行insert语句插入数据,事务自动提交了

    t9

    select * from account;

    查到4条数据

    读到了另一个线程自动提交事务的insert语句数据。虚读发生了

    t10

    commit;

     
  • 相关阅读:
    mysql优化——show processlist命令详解
    Nginx常见错误
    nginx应用总结(1)--基础认识和应用配置
    mac键盘在ubuntu下开启fn功能按键
    字符串逆序输出--递归
    getchar返回int类型
    c语言中字符串跨行书写的问题
    ascii
    c语言中不允许在函数外部给全局变量赋值
    CF和OF的区别
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/transaction.html
Copyright © 2011-2022 走看看