mysql 5.7 手动提交事务_mysql-7事务管理

本文介绍了MySQL 5.7中事务的使用场景和控制语句,包括begin、commit、rollback、savepoint等操作。详细讲解了不同自动提交模式下,对InnoDB和非InnoDB表进行数据操作时事务的影响,强调了事务处理中查看数据应避免客户端干扰。并给出了事务管理的实例,展示了如何提交和回滚事务。
摘要由CSDN通过智能技术生成

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;

4359d800fef3774c55c4b3c28395ba83.png

第二步:在场景1的基础上,使用事务管理继续执行

结果:第一步的数据提交成功,第二步的数据没有提交

begin;

-- 执行begin,先对之前的操作commit,再开始下一个事务。如果没有begin,执行的操作依然不会被提交。

insert into csj_transaction_test values(2,"jerry");

-- 使用终端查看

select * from csj_transaction_test;

20bfd8416b03523a23ad6051a0fdbf30.png

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;

8c7e867fd3f400ea4759fcce8382351a.png

第二步:在场景2的基础上,执行事务管理

结果:第二部的数据没有提交

begin;

insert into csj_transaction_test values (2,"jerry");

-- 使用终端查看。

-- 如果用事务,需要commit;否则,不会执行

select * from csj_transaction_test;

9f06ddb4ab4bb9d4bda6e70ad5da5674.png

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;

0b999d200a65020550eab7f5ecb4ac47.png

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;

c74d448e565c2fe12dfeb88033f1b4bd.png

结论: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;

b2268de54bf322c1140344a11366dde3.png

示例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;

3fcfb0736c5449036a80fe485a8bf221.png

示例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;

```

46eaa79b92944cf4a706789698d82043.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值