MySQL事务常见操作

提前准备

  • 将mysql的默认隔离级别设置成读未提交
set global transaction isolation level read uncommitted;

  • 设置完毕后,需要重启终端,进行查看
select @@tx_isolation;

  • 创建测试表
create table if not exists account(
id int primary key,
name varchar(50) not null default '',
blance decimal(10,2) not null default 0.0
)ENGINE=InnoDB DEFAULT CHARSET=UTF8;

  • 并且同时启动两个客户端,即两个SSH渠道。

事务常见操作方式

  • 先查看事务是否自动提交。我们故意设置成自动提交,看看该选项是否影响begin
show variables like 'autocommit';

  • 启动事务
-- 方式一
start transaction;

-- 方式二
begin;

  • 现在,我们给一端插入数据并且设置保存结点
savepoint s1;

此时的account表中的数据如下:

  • 现在,事务进行回滚
rollback to s2;

此时的account表中李四和王五这2条数据就没有了:

如果回滚到上面设置的保存点s1,那么account表中的数据自然就没有了。这就是回滚事务

  • 结束事务
commit;

  • 直接rollback的话会把从开始启动事务的所有操作全部丢弃

  • 事务持久化

此时再来查看表account:

此时即使后续在进行rollback操作,也没有影响了。

此时的数据永久化保存在数据库里了。也就是事务一经提交,就没办法再回滚了。也就是回滚只能在事务运行进行的期间,事务提交之后,无法回滚

事务异常

  • 事务运行期间出现异常,客户端崩溃,MySQL自动会回滚

先来看一下现在有一个表account,以及两个客户端,也就是以下的情况:(注意,事务是自动提交的show variables like 'autocommit';)

现在来看一下客户端崩溃,自动回滚的情况:

ctrl + \ 异常终止MySQL

另外,只要把事务统一commit之后,这个数据就直接被插入到数据库中,并不会因为客户端崩溃这种情况而出现数据回滚。

  • begin操作会自动更改提交方式,不会受MySQL是否自动提交影响

关闭自动提交

set autocommit=0;

插入数据commit后客户端崩溃:

此时的田七这条数据是存在的了

  • 证明单条 SQL 与事务的关系

场景一:先关闭自动提交

account表中的数据如下: 

现在执行单sql语句:数据被删除,但是如果aborted,当前的数据会自动回滚!

场景二:先打开自动提交

表account的数据如下:

现在执行单sql,aborted之后,删除就是删除了


autocommit会影响之前的单sql,每条sql就相当于事务,虽然没有写begin,没有写commit。单sql执行的时候,如果autocommit是off的,只是事务执行中,当这个客户端崩溃的时候,数据会回滚。如果autocommit是on的,信息直接提交到数据库进行持久化。

单sql也是事务,是自动提交的。如果autocommit是off关闭的,当sql执行后再commit之后数据就是持久化了。

结论:

  • 只要输入begin或者start transaction,事务便必须要通过commit提交,才会持久化,与是否设置set autocommit无关。
  • 事务可以手动回滚,同时,当操作异常,MySQL会自动回滚
  • 对于 InnoDB 每一条 SQL 语言都默认封装成事务,自动提交。(select有特殊情况,因为MySQL有 MVCC )
  • 从上面的例子,我们能看到事务本身的原子性(回滚),持久性(commit)

事务操作注意事项:

  • 如果没有设置保存点,也可以回滚,只能回滚到事务的开始。直接使用 rollback(前提是事务还没有提交)
  • 如果一个事务被提交了(commit),则不可以回退(rollback)
  • 可以选择回退到哪个保存点
  • InnoDB 支持事务, MyISAM 不支持事务
  •  开始事务可以使用 start transaction 或者 begin
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL常见操作面试题包括但不限于以下几个方面: 1. 什么是ACID? ACID是指数据库事务的四个特性: 原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation) 和持久性 (Durability)。这四个特性保证了事务的正确性和稳定性。 2. 什么是SQL语句? SQL(Structured Query Language)是一种用于管理关系数据库系统的语言。它用于创建、查询、更新和删除数据库中的数据。 3. 如何创建和删除数据库? 可以使用CREATE DATABASE语句来创建数据库,例如:CREATE DATABASE database_name;可以使用DROP DATABASE语句来删除数据库,例如:DROP DATABASE database_name; 4. 如何创建和删除表? 可以使用CREATE TABLE语句来创建表,例如:CREATE TABLE table_name (column1 datatype, column2 datatype, ...);可以使用DROP TABLE语句来删除表,例如:DROP TABLE table_name; 5. 如何向表中插入数据? 可以使用INSERT INTO语句来向表中插入数据,例如:INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); 6. 如何更新表中的数据? 可以使用UPDATE语句来更新表中的数据,例如:UPDATE table_name SET column1=value1, column2=value2, ... WHERE condition; 7. 如何删除表中的数据? 可以使用DELETE FROM语句来删除表中的数据,例如:DELETE FROM table_name WHERE condition; 8. 如何查询表中的数据? 可以使用SELECT语句来查询表中的数据,例如:SELECT column1, column2, ... FROM table_name WHERE condition; 9. 如何使用索引来提高查询性能? 可以使用CREATE INDEX语句来创建索引,例如:CREATE INDEX index_name ON table_name (column1, column2, ...);索引可以加快查询速度,但会增加插入、更新和删除的开销。 10. 如何根据条件对查询结果进行排序和过滤? 可以使用ORDER BY子句和WHERE子句来对查询结果进行排序和过滤,例如:SELECT column1, column2, ... FROM table_name WHERE condition ORDER BY column1 ASC;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值