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站教学视频

  • 相关阅读:
    python2.7_1.4_将IPV4地址转换成不同的格式
    大型网站问题的解决方案
    大型网站的标准
    SCP服务实现Linux交互
    SCP服务实现Linux交互
    使用Linux系统中的SSH服务
    向php文件中添加php.ini文件
    让apache与mysql随着系统自动启动
    为apache与mysql创建快捷方式
    安装PHP软件
  • 原文地址:https://www.cnblogs.com/liu-ai-yu/p/13162602.html
Copyright © 2011-2022 走看看