zoukankan      html  css  js  c++  java
  • mysql-7事务管理

    1.事务的使用场景

    mysql事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人愿,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务。

    • 在mysql中只有使用了Innodb数据库引擎的数据库或表,才能支持事务。
    • 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。
    • 事务用来管理insert update delete语句。
      在mysql命令行的默认设置下,事物都是自动提交的,即执行sql语句后就会马上执行commit操作。因此要显式的开启一个事务,必须使用命令begin或start或start transaction,或者执行命令set autocommit=0,用来禁止使用当前会话的自动提交。

    2. 事务控制语句:

    • begin或start transaction:显式的开启一个事务
    • commit:提交事务,并使已对数据库进行的所有修改成为永久性的。等价于commit work
    • rollback:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改,等同于rollback work
    • savepoint identifier:savepoint允许在事务中创建一个保存点,一个事务中可以有多个savepoint
    • release savepoint identifier:删除一个事务的保存点,当没有指定的保存点,执行该语句会抛出一个异常。
    • rollback to identifier:把事务会滚到标记点
    • set transaction:用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有read uncommitted、read committed、repeatable read和serializable

    3.事务处理主要有2种方法

    3.1.begin、rollback、commit来实现

    • begin:开始一个事务
    • rollback:事务会滚
    • commit:事务确认

    3.2.直接用set来改变mysql的自动提交模式

    • set autocommit=0 当前session禁用自动提交事物,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务。
    • set autocommit=1 开启自动提交

    4.事务处理中查看数据

    事务处理中,需要排除session的干扰,每次执行后,通过终端在mysql下查看数据,不要在客户端查看。

    docker exec -it csjmysql sh
    mysql -u root -p
    select * from csj_transaction_test;
    

    5.数据确认提交因素autocommit

    5.1.场景1:创建一个innodb类型的表,禁止自动提交。插入数据。

    结果:数据没有提交

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20)) engine=innodb;
    set autocommit=0;
    insert into csj_transaction_test VALUES (1,"tom");
    -- 使用终端查看
    select * from csj_transaction_test;
    

    第二步:在场景1的基础上,使用事务管理继续执行
    结果:第一步的数据提交成功,第二步的数据没有提交

    begin;
    -- 执行begin,先对之前的操作commit,再开始下一个事务。如果没有begin,执行的操作依然不会被提交。
    insert into csj_transaction_test values(2,"jerry");
    -- 使用终端查看
    select * from csj_transaction_test;
    

    5.2.场景2:创建一个innodb类型的表,允许自动提交,插入数据。

    结果:数据自动提交

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20)) engine=innodb;
    set autocommit=1;
    insert into csj_transaction_test values(2,"jerry");
    -- 使用终端查看
    select * from csj_transaction_test;
    

    第二步:在场景2的基础上,执行事务管理
    结果:第二部的数据没有提交

    begin;
    insert into csj_transaction_test values (2,"jerry");
    -- 使用终端查看。
    -- 如果用事务,需要commit;否则,不会执行
    select * from csj_transaction_test;
    

    5.3.场景3:创建一个普通表,禁止自动提交。插入数据

    结果:数据没有提交

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20))
    set autocommit=0;
    insert into csj_transaction_test VALUES (1,"tom");
    -- 使用终端查看
    select * from csj_transaction_test;
    

    5.4.场景4:创建一个普通表,允许自动提交。插入数据

    结果:数据自动提交

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20));
    set autocommit=1;
    insert into csj_transaction_test values(2,"jerry");
    -- 使用终端查看
    select * from csj_transaction_test;
    

    结论:

    • 1.innodb只是一种数据库引擎,提供了事务的隔离级别,不会改变数据库的自动提交属性。是否提交当前和autocommit的值有关。
    • 2.如果使用事务管理。begin会对先前的操作进行提交;begin之后的操作需要commit才能提交。

    6.事务示例

    示例1:基于3.1

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20)) engine=innodb;
    begin;
    insert into csj_transaction_test VALUES (1,"tom");
    insert into csj_transaction_test values(2,"jerry");
    commit;
    -- 使用终端查看
    select * from csj_transaction_test;
    

    示例2:基于3.1

    drop table if exists csj_transaction_test;
    create table csj_transaction_test (id int(5),name varchar(20)) engine=innodb;
    begin;
    insert into csj_transaction_test VALUES (1,"tom");
    insert into csj_transaction_test values(2,"jerry");
    rollback;
    -- 使用终端查看
    select * from csj_transaction_test;
    
    示例3:基于3.2 ```#sql drop table if exists csj_transaction_test; create table csj_transaction_test (id int(5),name varchar(20)) engine=innodb; set autocommit=0; insert into csj_transaction_test VALUES (1,"tom"); insert into csj_transaction_test values(2,"jerry"); commit; -- 使用终端查看 select * from csj_transaction_test; ```

    菜鸟教程 mysql事务

  • 相关阅读:
    访问 http://localhost:8081对 flink 集群和任务进行监控管理
    Flink之流处理WordCount
    Flink之批处理WordCount
    为什么说JAVA中runnable接口的run方法运行在子线程?
    Java中的字符输入输出流练习
    在JAVA中实现文件读写练习
    JAVA自定义异常使用方法
    三种二叉树遍历的非递归算法
    C编译错误:Main.c:4:5: error: variably modified ‘f’ at file scope int f[maxn];
    中序+先序构造二叉树,后序遍历
  • 原文地址:https://www.cnblogs.com/csj2018/p/9954075.html
Copyright © 2011-2022 走看看