zoukankan      html  css  js  c++  java
  • mysql事务

    事务是一个最小的不可分割的工作单元,能改保证一个业务的完整性

    例 银行转账

    a -> -100

    update user set money= money -100 where name ='a';

    b-> +100

    update user set money= money +100 where name ='b';

    如果两条语句,只执行成功一条,那么 就会出现数据的先后不一致问题

    所以事务的出现就会要求多条语句同时成功或者同时失败。

    mysql是默认开启事务的

    mysql> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+               // 为1 代表自动提交 ,不能回滚
    |            1 |
    +--------------+ 
    
    • 默认事务开启的作用:执行一天mysql语句时,效果会立即体现出,且不能回滚。

    实例:创建一个数据表

    mysql> create table user12(
    -> id int primary key,
    -> name varchar(20),
    -> money int
    -> );

    插入数据:insert into user12 values(1,'a',1000);

    查询数据:select* from user12;

    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    +----+------+-------+
    
    • 事务回滚----撤销操作效果rollback)

    我们接着执行 rollback;

    rollback;
    

    再来查询,select* from user12;

    +----+------+-------+
    | id | name | money |
    +----+------+-------+    //可以看到 不能回滚
    |  1 | a    |  1000 |
    +----+------+-------+
    

    所以我们要想回滚,只需要把上面的@@autocommit变为0

    set @@autocommit=0;
    输出:
    +--------------+
    | @@autocommit |            //0 关闭了自动提交
    +--------------+
    |            0 |
    +--------------+
    

    我们再插入一条数据:insert into user12 values(2,'b',2000);

    mysql> select* from user12;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    |  2 | b    |  2000 |
    +----+------+-------+
    

    尝试 回滚:rollback;

    `+----+------+-------+`
    `| id | name | money |`
    `+----+------+-------+`    //撤销刚刚的操作
    `|  1 | a    |  1000 |`
    `+----+------+-------+`
    

    如果想插入第二条语句之后,立即生效,在后边直接加 commit;------手动提交

    如果们不想设置 autocommit的值,可以尝试使用 begin或者 start transaction,都可以帮我们手动开启一个事务

    先查看一下我们的账户:select* from user12;

    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |  1000 |
    |  2 | b    |  2000 |
    +----+------+-------+
    

    执行转账操作:

    mysql> update user12 set money= money -100 where name ='a';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> update user12 set money= money +100 where name ='b';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select* from user12;
    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |   900 |
    |  2 | b    |  2100 |
    +----+------+-------+
    2 rows in set (0.00 sec)
    

    rollback;一下,没有回滚,因为autocommit的值是1

    我们再次执行转账操作,但是这次在前面加一个begin

    mysql> begin;
    mysql> update user12 set money= money -100 where name ='a';
    mysql> update user12 set money= money +100 where name ='b';
    

    查询一下:

    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |   800 |
    |  2 | b    |  2200 |
    +----+------+-------+
    

    现在,rollback;一下,再次查询:

    +----+------+-------+
    | id | name | money |
    +----+------+-------+
    |  1 | a    |   900 |   //回滚成功
    |  2 | b    |  2100 |
    +----+------+-------+
    
    start transac 效果相同

    若想提交,直接commit 一下就好

    事务的四大特征

    • A 原子性:最小的单位,不可分割
    • C 一致性:同时成功或失败
    • I 隔离性:事务1 和事务2 互不干扰
    • D 持久性:事务一旦结束,不可回滚(commit,rollback)

    下面主要介绍一下 事务的隔离性:

    未完待续。。。。。。。

    学习自编程158俱乐部b站教学视频

  • 相关阅读:
    Redis简单实践-分布式锁
    Redis基础数据结构
    Redis介绍
    MakeGenericType方法,运行时传入泛型T参数,动态生成泛型类
    Visual Studio 2017 Ctrl+单击键会跳转到定义的设置
    10 分钟 创建分布式微服务
    nodejs 中自定义事件
    我是这么给娃娃取名的(使用 node.js )
    使用 Fiddler 上传微信公众账号 自定义菜单
    drf_yasg 简单使用
  • 原文地址:https://www.cnblogs.com/liu-ai-yu/p/13162602.html
Copyright © 2011-2022 走看看