mysql的事务和存储引擎

mysql的事务和存储引擎

1.事务的概念

事务就是用户定义的一系列执行SQL语句的操作, 这些操作要么完全地执行,要么完全地都不执行, 它是一个不可分割的工作执行单元。

2.事物使用的场景

在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,这种情况是不允许出现,要想解决这个问题就需要通过事务来完成。

3.事物的四大特性

原子性(Atomicity)
一致性(Consistency)
隔离性(Isolation)
持久性(Durability)
原子性:

一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性.

一致性:

数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在转账过程中系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)

隔离性:

通常来说,一个事务所做的修改操作在提交事务之前,对于其他事务来说是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)

持久性:

一旦事务提交,则其所做的修改会永久保存到数据库。

说明:事务能够保证数据的完整性和一致性,让用户的操作更加安全。

事务的特性:

原子性: 强调事务中的多个操作时一个整体
一致性: 强调数据库中不会保存不一致状态
隔离性: 强调数据库中事务之间相互不可见
持久性: 强调数据库能永久保存数据,一旦提交就不可撤销
MySQL数据库默认采用自动提交(autocommit)模式, 也就是说修改数据(insert、update、delete)的操 作会自动的触发事务,完成事务的提交或者回滚
开启事务使用 begin 或者 start transaction; 事务 81
回滚事务使用 rollback;
pymysql 里面的 conn.commit() 操作就是提交事务
pymysql 里面的 conn.rollback() 操作就是回滚事务

4.事务之间的互相影响

一个事务的执行不能被其他事务干扰,事务之间的相互影响分为几种,分别为脏读、不可重复读、幻读、丢失更新

脏读(读取未提交数据)

脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据,读到了不一定最终存在的数据,这就是脏读。

不可重复读(前后多次读取,数据内容不一致)

一个事务内两个相同的查询却返回了不同数据,这是由于查询时系统中其他事务修改的提交而引起的。

幻读(前后多次读取,数据总量不一致)

一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,操作前一个事务的用户 会发现表中还有没有修改的数据行,就好像发生了幻觉一样。

丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果。

MYSQL事务隔离级别

read_uncommitted (未提交度): 读取尚未提交的数据 :不解决脏读

read_committed(提交读):读取已经提交的数据 :可以解决脏读

repeatable_read:(可重复读):可以解决脏读 和 不可重复读 —mysql默认的

serializable:串行化:可以解决脏读、不可重复读和虚读—相当于锁表

mysql默认的事务处理级别是 repeatable read ,而Oracle和SQL Server是 read committed

事务隔离级别的作用范围分为两种:

  • 全局级:对所有的会话有效

  • 会话级:只对当前的会话有效

查询全局事务隔离级别

show global variables like '%isolation%';
select @@global.tx_isolation;

image-20220809152550776

查询会话事务隔离级别

show session variables like '%isolation';
select @@session.tx_isolation;
select @@tx_isolation;

image-20220809152952737

设置全局事务隔离级别

set global transaction isolation level serializable;
show global variables like '%isolation%';

image-20220809155941177

设置会话事务隔离级别

set session transaction isolation level read committed;

image-20220809160340141

事务控制语句

BEGIN 或 START TRANSACTION:显式地开启一个事务。
COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。
ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称。
ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

测试提交事务

begin;
update ky20 set score=33 where id=4;
select * from ky20;

image-20220809162156546

image-20220809162318466

测试回滚事务

begin;
update ky20 set score=score - 10 where id=5;
rollback;   ##回滚

image-20220809162758895

image-20220809162909700

测试多点回滚

 begin;
update ky20 set score=score - 9 where id=6;
 savepoint s1;
update ky20 set  score=score - 20 where id =8;
savepoint s2;
rollback to s1;

image-20220809163929959

image-20220809164122090

image-20220809164205097

使用set设置控制事务

在MySQL中,当我们输入命令时,是系统在自动帮我们begin与commit,我们无需手动输入。这是因为mysql数据库默认设置了自动提交。

show variables like 'autocommit

image-20220809170356716

#禁止自动提交(状态为OFF)
SET AUTOCOMMIT=0; 
 
 
#开启自动提交,Mysql默认为1(状态为ON)
SET AUTOCOMMIT=1;

image-20220809170622558

image-20220809171134053

image-20220809171329547

注意
  1. 如果没有开启自动提交,当前会话连接的MySQL的所有操作都会当成一个事务直到你输入rollback|commit,当前事务才算结束。当前事务结束前新的MySQL连接时无法读取到任何当前会话的操作结果。
  2. 如果开启自动提交,MySQL会把每个SQL语句当成一个事务,然后自动的commit。
  3. 当然无论开启与否,begin,commit,rollback,都是独立的事务。

二.MySQL存储引擎

果没有开启自动提交,当前会话连接的MySQL的所有操作都会当成一个事务直到你输入rollback|commit,当前事务才算结束。当前事务结束前新的MySQL连接时无法读取到任何当前会话的操作结果。
2. 如果开启自动提交,MySQL会把每个SQL语句当成一个事务,然后自动的commit。
3. 当然无论开启与否,begin,commit,rollback,都是独立的事务。

二.MySQL存储引擎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到数据库操作时,事务存储引擎是两个重要的概念。 1. 事务事务是一组数据库操作,被视为一个单独的工作单元,要么全部成功执行,要么全部失败回滚。事务的目的是确保数据库的一致性和完整性。 在MySQL中,使用以下语句来管理事务: - BEGIN 或 START TRANSACTION:开始一个事务。 - COMMIT:提交事务,将所有修改永久保存到数据库。 - ROLLBACK:回滚事务,放弃所有未提交的修改。 事务具有ACID属性: - 原子性(Atomicity):事务中的所有操作都要么全部执行成功,要么全部失败回滚。 - 一致性(Consistency):事务执行前后数据库从一个一致性状态转换到另一个一致性状态。 - 隔离性(Isolation):并发执行的事务之间是相互隔离的,每个事务感知不到其他事务的存在。 - 持久性(Durability):一旦事务提交,其结果将永久保存在数据库中,即使发生系统故障也不会丢失。 2. 存储引擎存储引擎数据库管理系统中负责数据存储和检索的组件。MySQL支持多种存储引擎,常见的有InnoDB、MyISAM、Memory等。 不同的存储引擎具有不同的特点和适用场景: - InnoDB:默认的存储引擎,支持事务、行级锁、外键等特性,适用于大部分应用。 - MyISAM:不支持事务和行级锁,但具有较高的插入和查询速度,适用于读写频率较低的应用。 - Memory:将数据存储在内存中,读写速度非常快,但数据在数据库重启后会丢失,适用于缓存或临时数据。 通过在创建表时指定不同的存储引擎,可以根据应用的需求选择合适的存储引擎来优化数据库性能和功能。例如,使用InnoDB存储引擎可以保证事务的一致性和隔离性,而使用MyISAM存储引擎可以获得更好的读写性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值