栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mysql事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mysql事务

目录

一、事务

1、概述2、事务特性(ACID)

(1)原子性(不可分割)(2)持久性(3)隔离性(独立性)(4)一致性 3、事务设置

(1)直接用 SET 来改变 MySQL 的自动提交模式(2)查看 autocommit 模式(3)用 BEGIN, ROLLBACK, COMMIT 来实现 4、并发事务处理带来的问题

(1)脏读(2)不可重复读(3)幻读 5、事务隔离级别

(1)读未提交(read uncommitted):(2)读已提交(read committed):(3)可重复读(repeatable read MySQL 默认隔离级别):(4)串行化(serializable):

一、事务 1、概述

事务就是一次完整的数据库操作,这个操作过程中可能包含多条sql执行。这多条sql的自执行时是一个整体,要么都执行成功,要么都执行失败。
eg:

转账操作:从A账号,向B账号转钱;A-100;B+100;
网购下单支付:下订单到卖家;支付到平台

Mysql中只有Innodb引擎支持数据库事务的事务用来管理 insert,update,delete 语句 2、事务特性(ACID) (1)原子性(不可分割)

一次事务过程中多个操作要么都成功,要么都失败,事务在执行过程中发生错误,会被回滚
(Rollback)到事务开始前的状态。

(2)持久性

事务一旦提交,数据就不可改变,即便系统故障也不会丢失。

(3)隔离性(独立性)

允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。

隔离分为4个级别

    读未提交 : 问题:脏读读已提交 : 解决:脏读 问题 :不可重复读可重复读 : 解决:不可重复读 问题 :幻读串行化 : 解决一切问题 :加锁 ,效率低
(4)一致性

在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
eg:

我们多种方式对银行账户的余额进行多次同时操作,最终余额应该是我们所预期的结果,不能出现错误。

原子性、持久性和隔离性,都是为了保证数据库状态的一致性。 3、事务设置 (1)直接用 SET 来改变 MySQL 的自动提交模式

SET SESSION / GLOBAL autocommit=0; 禁止自动提交
SET SESSION / GLOBAL autocommit=1;开启自动提交
(2)查看 autocommit 模式
SHOW SESSION / GLOBAL VARIABLES LIKE 'autocommit';

(3)用 BEGIN, ROLLBACK, COMMIT 来实现
BEGIN; / START TRANSACTION; 开始一个事务

ROLLBACK 事务回滚

COMMIT 事务确认
4、并发事务处理带来的问题

当A事务和B事务选择同一行(id)进行操作时,互相不知道对方的存在,则会发生丢失更新问题,即最后的更新覆盖了前一个程序员所做的更改。

(1)脏读

读到了垃圾数据,读取到其他事务未提交的数据
1.事务 B 更新年龄 18
2.事务 A 读取数据库信息,年龄是 18
3.事务 B 回滚
(2)不可重复读

A事务开启后,读取两次数据,结果两次读到的内容不一样(预期的效果是A在同一个事务中读取到的数据应该是一样)。
(3)幻读

A事务开启后,读取到的两次两次数据数量不一样
1.事务 A 读取年龄大于 15 的数据,发现有 1 条记录
2.事务 B 插入一条记录,并提交
3.事务 A 再读取年龄大于 15 的数据,发现有 2 条记录
5、事务隔离级别

以下事务隔离是指在Innodb下的事务隔离级别。查看隔离级别

SELECT @@global.transaction_isolation,@@transaction_isolation;

设置隔离级别

SET SESSION/GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
(1)读未提交(read uncommitted):

A可以读取到B未提交的修改。
问题:脏读,幻读,不可重复读。


(2)读已提交(read committed):

A只能读取B已经提交的修改。
问题:避免了脏读,仍然存在不可以重复读和幻读问题。


(3)可重复读(repeatable read MySQL 默认隔离级别):

A事务中多次读取相同的数据返回的结果是一样的。
问题:避免了脏读和不可重复读问题,(mysql8之后幻读不存在)但是幻读依然存在。

(4)串行化(serializable):

事务串行执行,避免了以上所有问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/710857.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号