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;

     
  • 相关阅读:
    导出EXCEL 没有乱码,已确认可以使用, 转自csdn
    发送微信模板消息 已测试通过
    mysql 无法启动 innodb 报错 1067
    redis3.0集群搭建
    centos下编译openjdk1.8
    Redis无法远程访问
    记一次优化的的意外收获
    mysql的基础优化
    关于inputStream.read()返回值的问题
    rest风格的url接收
  • 原文地址:https://www.cnblogs.com/fjkgrbk/p/transaction.html
Copyright © 2011-2022 走看看