MySQL-事务处理

这篇具有很好参考价值的文章主要介绍了MySQL-事务处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MySQL事务

什么是事务

  • 数据中的事务是指数据库执行的一些操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功,部分失败的情况

MySQL-事务处理

如果在事务的支持下,最终有两种结果:

  • 操作成功:A账户减少100,B账户增加100
  • 操作失败:A,B账户没有发生任何变化

事务的特征(ACID)

原子性(Atomicity)

事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果上来看的,从最终结果上来看的话这个过程是不可分割的

一致性(Consistency)

一个事务必须使数据库从一个一致性转换到另一个一致性的状态

一致性:

  • 从业务逻辑上来说,最终结果符合逻辑就是一致性

隔离性(Isolation)

一个事务的执行不能被其他事务干扰。事务与事务之间不能互相干扰。

持久性(Durability)

一个事务一旦提交了,对数据库中的数据来说应该是永久性的。当事务提交之后,数据会持久化到磁盘中,修改时永久性的。

MySQL中的事务操作

mysql中事务默认为隐式事务,执行insert,update,delete操作的时候,数据库会自动开启事务,提交或回滚事务

是否开始隐式事务时有变量autocommit控制的

隐式事务

隐式事务自动开启,提交或回滚,比如insert,update,delete语句,事务的开启,提交或回滚由mysql内部自动控制的

show variables like 'autocommit';

MySQL-事务处理

autocommit为ON表示开启自动提交

显式事务

显式事务手动开启,提交和回滚,由开发者自动控制

方式1

语法:

//设置不自动提交事务
set autocommit  = 0;
//执行事务的操作
commit//提交事务
rollback//回滚事务

示例1:

create table test( a int);
窗口1 窗口2
设置为不自动提交(set commit = 0)
insert into test values (10)
select * from test;(有数据10) select * from test;(没有数据10)
commit;
select * from test;(有数据10) select * from test;(有数据10)
insert into test values (11)
select * from test;(有数据11) select * from test;(没有11)
rollback;(回滚)
select * from test;(没有数据11) select * from test;(没有数据11)

autocommit:还原

-- 自动提交事务
set autocommit  = 1;
方式2

语法:

-- 开启事务
start transaction ;
-- 执行事务
-- 提交事务
commit ;
-- 回滚事务
rollback ;

案例1:

窗口1 窗口2
show variables like ‘autocommit’;(默认开启) show variables like ‘autocommit’;(默认开启)
start transaction ;(开启事务)
insert into test values (11);
select * from test;(没有数据) select * from test;(没有数据)
commit;
select * from test;(有数据)

案例2:

窗口1 窗口2
show variables like ‘autocommit’;(默认开启) show variables like ‘autocommit’;(默认开启)
start transaction ;(开启事务)
delete from test where a = 11;
select * from test;(数据不存在11) select * from test;(数据存在11)
rollback;(回滚)
select * from test;(数据存在11) select * from test;(数据存在11)

savepoint关键字

示例:

窗口1 窗口2
show variables like ‘autocommit’; show variables like ‘autocommit’;
start transaction ;(开启事务)
insert into test values (4);
savepoint insert_save1;(设置一个保存点insert_save1)
delete from test where a = 10;
savepoint delete_save2;
rollback to delete_save2;
commit;
select * from test;(有10数据) select * from test;(有10数据)

只读事务

表示在事务中执行的是一些只读操作,比如查询,但不会做insert,update,delete操作,数据库内部对只读事务可能回有一个性能上的优化

用法:

start transaction read only ;

示例:

-- 提交事务
commit ;

-- 开启只读事务
start transaction read only ;

select * from test;

-- 删除全部数据
delete from test;
-- 只读状态无法删除数据
[25006][1792] Cannot execute statement in a READ ONLY transaction.
-- 提交事务
commit ;

select * from test;

只读事务中执行delete操作会报错: 只读状态无法删除数据

脏读

# 设置脏读
set session transaction isolation level read uncommitted;

脏读是指在数据库中,一个事务读取了另一个事务未提交的数据。

如果这些未提交的数据被回滚了,那么第一个事务读取的数据就是无效的。

读已提交

set session transaction isolation level read committed ;

一个事务操作过程中可以读取到其他事务已提交的数据

事务中的每次读取操作,读取到的都是数据库中其他事务已提交的最新的数据(当前读)

可重复读

一个事务操作中对应一个读取操作不管多少次,读到的数据结果始终都是一样的

幻读

幻读在可重复度的模式下才会出现的,其他隔离隔离级别中不会出现

例如:

在可重复读模式下,如有用户表,手机号为主键,两个数据操作:

事务1:

  • 打开只读事务
  • 查询电话号码为x的存在,发现不存在
  • 插入电话号码为x的数据,插入报错
start transaction read only ;

select * from user1 where iphone = 120;

insert into user1 values ('zhangsan',110);

commit ;

事务2:

对于事务2操作来说,发生幻觉了一样,

start transaction ;

insert into user1 values ('zhangsan',120);

select * from user1 where iphone = 120;

commit ;

事务中后面的操作(插入电话号码数据)需要提交事务之后才可以支持,对于事务2来说可以添加数据,但是不能查询数据,

事务的隔离级别

隔离级别分为4种:

  • 读未提交:READ-UNCOMMITED
  • 读已提交: READ-COMMITTED
  • 可重复读: REPEATABLE-READ
  • 串行: SERIALIZABLE

当多个事务同时进行的时候,如何确保当前事务种数据的正确性,不如A,B两个事务同时进行的时候,A是否可以看到B已提交事务或者未提交事务,需要看到的话依靠隔离界别来保证,不同隔离级别可以产生的效果不一样。

事务的隔离级别主要解决了多个书屋之间数据可见性和数据正确性的问题。

查看隔离级别

show variables like 'transaction_isolation';

MySQL-事务处理

当前隔离级别为可重复读

隔离级别的设置

READ-UNCOMMITTED:读未提交

修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini文件,设计隔离级别

# 设置为读未提交
transaction-isolation=READ-UNCOMMITTED

MySQL-事务处理

MySQL-事务处理

修改完成后重启mysql服务

C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。

修改完成后查看隔离级别

show variables like 'transaction_isolation';

MySQL-事务处理

按照时间顺序在2个窗口执行

时间 窗口1 窗口2
T1 start transaction ;
T2 select * from test;
T3 start transaction;
T4 insert into test values(1);
T5 select * from test;
T6 select * from test;
T7 commit;
T8 select * from test;
T9 commit;

窗口1可以读取到窗口2未提交的数据,说明出现了脏读

结论:

  • 在读未提交的情况下,可以读取到其他事务还未提交的数据,多次读取,出现脏读,不可重复读

READ-COMMITED:读已提交

# 设置为读已提交

transaction-isolation=READ-COMMITTED

MySQL-事务处理

C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

MySQL-事务处理

按照时间顺序在2个窗口执行

时间 窗口1 窗口2
T1 start transaction ;
T2 select * from test;
T3 start transaction;
T4 insert into test values(1);
T5 select * from test;
T6 select * from test;
T7 commit;
T8 select * from test;
T9 commit;

窗口1开启事务,无法读取到窗口2未提交的数据,说明没有脏读

窗口2提交事务后,窗口1则可以读取到数据。

结论:

  • 在读已提交的情况下,无法读取到其他窗口未提交的数据,可以读取到已提交的数据

REPEATABLE-READ:可重复读

# 设置为可重复读
transaction-isolation=READ-COMMITTED
C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

MySQL-事务处理

按照时间顺序在2个窗口执行

时间 窗口1 窗口2
T1 start transaction ;
T2 select * from test;
T3 start transaction;
T4 insert into test values(1);
T5 select * from test;
T6 select * from test;
T7 commit;
T8 select * from test;
T9 commit;
T10 select * from test;

窗口2未提交事务,窗口1无法查找未提交数据:未出现脏读

窗口2提交事务后,窗口1依旧无法查看数据

窗口1提交事务后,窗口1可以查看窗口2提交的事务数据

SERIALIZABLE:串行

SERIALIZABLE会让并发的事务串行执行(多个事务之间读写,写读,写写会产生互斥,这个效果就是串行执行,多个事务之间读读操作不会产生互斥)

读写互斥:事务1中先读取操作,事务2发起写入操作,事务1中的读取会导致事务2中的写入处于等待状态,直到事务1完成为止;

# 设置串行
transaction-isolation=SERIALIZABLE
C:\WINDOWS\system32>net stop mysql57
MySQL57 服务正在停止.
MySQL57 服务已成功停止。

C:\WINDOWS\system32>net start mysql57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
# 查看隔离级别
show variables like 'transaction_isolation';

MySQL-事务处理

按照时间顺序在2个窗口执行

时间 窗口1 窗口2
T1 start transaction ;
T2 select * from test;
T3 start transaction;
T4 insert into test values(1);
T5
T6 commit;
T7 commit;

隔离级别为串行状态下,事务只能串行执行,串行情况下不存在脏读,不可重复读,幻读的问题

各个隔离级别中出现的问题

隔离级别 脏读 不可重复读 幻读
读未提交 READ-UNCOMMITED
读已提交 READ-COMMITTED
可重复读 REPEATABLE-READ
串行 SERIALIZABLE

总结

事务的特性:原子性,隔离性,一致性,持久性

是否开启自动提交事务:set autocommit = 0 :手动,1 :自动;

开启事务: start transcation

开启只读事务:start transcation read only;

提交事务:commit;

回滚事务:rollback;

设置保存点:savepoint (name);

回滚保存点:rollback to (name);

查看隔离级别:show variables like ‘transaction_isolation’;文章来源地址https://www.toymoban.com/news/detail-416242.html

到了这里,关于MySQL-事务处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL中的事务基础

    MySQL中的事务指的是在数据库操作中,将一组SQL语句作为一个不可分割的执行单元进行处理的机制。事务具有原子性、一致性、隔离性和持久性的特性(ACID特性)。 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚。如果事务执行过程中发生错误或

    2024年02月11日
    浏览(21)
  • 【MySQL】一文搞懂 MySQL 中的事务

    谈事务,一般就是说数据库事务。本篇文章以 MySQL 为例谈一谈事务。 MySQL 的 Indndb 引擎和 bdb 引擎支持事务。MySQL 的myisam ,memory 等存储引擎是不支持事务的。 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务具体四大特性,也就是经常说的 ACID ,常用的MySQL、Sq

    2024年02月09日
    浏览(33)
  • 深入理解MySQL中的事务和锁

    目录 数据库中的事务是什么? MySQL事务的隔离级别 脏读、不可重复读、幻读 MVCC(多版本并发控制) 快照读和当前读 MySQL中的锁 MyISAM引擎的锁: InnoDB引擎的锁: 乐观锁和悲观锁 共享锁和排他锁 事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操

    2024年02月05日
    浏览(29)
  • 数据库事务是什么?事务的四大特性是什么?

    事务是一组原子性的 SQL 语句,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组操作的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,事务内的语句,要么全部执行成

    2024年02月05日
    浏览(43)
  • 数据库的事务处理

    在现代信息化时代,大量的数据不断地被创建、修改、删除和查询。 为了保证数据的准确性和一致性,数据库的事务处理成为了必不可少的一个重要组成部分。 本文将针对数据库的事务处理进行详细阐述,包括事务的概念、特性、ACID属性、隔离级别以及事务的并发控制等方

    2024年02月06日
    浏览(51)
  • Spring数据库事务处理

    事务回滚丢失更新: 目前大部分数据库已经通过锁的机制来避免了事务回滚丢失更新。 数据库锁的机制: 锁可以分为乐观锁和悲观锁,而悲观锁又分为:读锁(共享锁)和写锁(排它锁),而数据库实现了悲观锁中的读锁和写锁,而乐观锁则需要开发人员自己实现。 数据库在设

    2024年02月07日
    浏览(42)
  • 【Mysql数据库 第13章】MySQL的事务、事务的隔离级别、事务的保存点

    💖Spring中的创建对象的三种方式、第三方资源配置管理详细描述及使用(XML版完结篇) 💖Spring中的bean的配置、作用范围、生命周期详细描述及使用(XML版上篇) 💖

    2023年04月20日
    浏览(49)
  • HBase的数据批量操作与事务处理

    HBase是一个分布式、可扩展、高性能的列式存储系统,基于Google的Bigtable设计。它是Hadoop生态系统的一部分,可以与HDFS、MapReduce、ZooKeeper等组件集成。HBase具有高可用性、高可扩展性和高性能等特点,适用于大规模数据存储和实时数据处理。 在大数据时代,数据的批量操作和

    2024年02月22日
    浏览(35)
  • MySQL数据库--事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱, 文章等等。这样,这些数据库操作语句就构成一个事务! 事务是一种机制、一个操作序列,包含了一

    2024年02月11日
    浏览(37)
  • 【MySQL数据库】事务

    事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体,一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。 事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时,事务是最小的控制单

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包