mysql事务

SpringBoot事务

旧时模样 提交于 2019-11-29 21:25:20
重要概念 自动提交模式 对于mysql数据库,默认情况下,数据库处于自动提交模式。每一条语句处于一个单独的事务中,在这条语句执行完毕时,如果执行成功则隐式的提交事务,如果执行失败则隐式的回滚事务。对于正常的事务管理,是一组相关的操作处于一个事务之中,因此必须关闭数据库的自动提交模式,下面是查看方式: 查看是否自动提交命令(ON表示开启自动提交,值为1,OFF表示关闭自动提交,值为0): show variables like 'autocommit'; 关闭自动提交后,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。 DataSource connection = masterDataSource.getConnection(); connection.setAutoCommit(false); 事务隔离级别 隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量: TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

mysql事务

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-29 19:59:10
1. 事务的基本介绍 1. 概念: * 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。 2. 操作: 1. 开启事务: start transaction; 2. 回滚:rollback; 3. 提交:commit; 3. 例子: CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加数据 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000); SELECT * FROM account; UPDATE account SET balance = 1000; -- 张三给李四转账 500 元 -- 0. 开启事务 START TRANSACTION; -- 1. 张三账户 -500 UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan'; -- 2. 李四账户 +500 -- 出错了... UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi'; --

mysql事务的使用

混江龙づ霸主 提交于 2019-11-29 19:17:11
事务的目的: (1) 为了保证的数据的安全. 比如:转钱的场景,A转给B 100, A-100,B+100有两步操作,开启事务后两步骤都完成才会完整的写入数据库,否则执行回滚操作回到原始状态。 (2) 涉及多张表的操作时候(比如表是有关联的) 删除这种有关联的,如果某张表删除数据出错,那前面已经删除的关联表就没数据了,下次删除就又可能出现其它问题,所以通过事务可以解决这个问题,要么都删除成功,要不都不动。 事务的介绍: MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 事务用来管理 insert,update,delete 语句。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 4个条件介绍: 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节

mysql mvcc 的理解

走远了吗. 提交于 2019-11-29 19:16:40
mvcc 全称 multiple version concurrency control 多版本并发控制,是数据库领域比较常用的一种非锁并发技术。 mysql 的innodb中,在RR、RC级别会使用mvcc来提升并发。 实现原理:   首先理解几个基本知识点。 一、mysql在行都设置了默认列(对查询不可见),包含有 data_trx_id、data_roll_ptr、db_row_id、delete bit db_row_id是在用户没设置聚集索引保留 delete bit 删除标志 data_trx_id 最近更新或创建 这条记录的 事务id data_roll_ptr 回滚指针(也称之为删除事务id,在事务中查找查找上个版本的记录就靠这个指针,指向了undo log的地址,可以把同一个事务中的多个版本理解为链式关系) 二、Read View:RR、RC级别,开启事务时,每个事务各自都会维护一份Read View,ReadView 中包含了当前DBMS中活跃的事务id列表(即begin开启了,但未commit的事务),后续简称RV。 三、事务select的检索的规则: 查找比当前事务id小的trx_id,这样能够保证查询出当前事务开启前已经写入或提交的数据。 查找行删除事务Id未设置或者删除事务Id值大于当前事务Id,这样能保证,当前事务开启后被删除的数据对当前事务是可见的。

MySQL数据库(SQL语句、JDBC、连接池)

南笙酒味 提交于 2019-11-29 19:12:19
MySQL数据库 概念 用于存储和管理数据的仓库。 特点: 1、持久化存储数据的,就是一个文件系统。 2、方便存储和管理数据 3、方便了统一的方式操作数据库---SQL cmd启动MySQl 使用管理员打开cmd net start mysql 启动MySQL服务器 net stop mysql 关闭MySQL服务器 MySQL登录; mysql -uroot -proot -p连接的密码 mysql -uIP地址 -p连接目标密码 mysql --host=ip --user=root --password=连接目标的密码 MySQL退出; exit quit SQL 什么是SQL: Structured Query Language 结构化查询语言 其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方,称为“方言”。 SQl分类 DDL(Data Definition Language)数据定义语言 用来定义数据库对象:数据库,表,列表。关键字:create,drop,alter等 操作数据库:CRUD C(create)创建 创建数据库格式: create database 数据库名称; 创建数据库,判断不存在,在创建: create database if not exists 数据库名称; 创建数据库,并指定字符集: create

Centos7 Docker安装mysql5.7

本小妞迷上赌 提交于 2019-11-29 19:11:19
Centos7 Docker安装mysql5.7,当然版本可以自定义,这里只是本人当前用的是5.7的。 1、拉取mysql5.7镜像 docker pull docker.io/mysql:5.7 2、拉取之后可以看到 docker images -a 3、下面为mysql容器运行创建挂载目录 mkdir -p /test/mysql/data //用于存放mysql数据备份 chmod -R 777 mysql //对当前目录进行授权,否则运行镜像后会发现statu 状态为exited mkdir -p /test/mysql/conf //用于存放mysql的主配置文件如 my.cnf mkdir -p /test/mysql/logs //用于存放mysql运行日志 4、进入本地 /test/mysql/conf目录中 touch my.cnf //创建mysql的住配置文件,然后填入配置的内容就好了 参考内容如下: [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/mysql datadir = /data/mysql pid-file = /data/mysql/mysql.pid user =

mysql

北城以北 提交于 2019-11-29 18:36:22
索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询. 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序,原理同上. hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测.AAAA和AAAAB的索引没有相关性.

事务隔离级别中可重复读与幻读的恩恩怨怨

守給你的承諾、 提交于 2019-11-29 18:18:50
前言 中秋刚过,大家是不是还没充中秋的假日里缓过来?三天假期里,我深入窥探了Innodb中可重复读与幻读,非常有意思,分享给大家,作为大家工作前的开胃小菜,希望有所帮助. 每次谈到数据库的事务隔离级别,大家一定会看到这张表. 其中, 可重复读 这个隔离级别,有效地防止了脏读和不可重复读,但仍然可能发生幻读, 可能 发生幻读就表示 可重复读 这个隔离级别防不住幻读吗? 我不管从数据库方面的教科书还是一些网络教程上,经常看到RR级别是可以重复读的,但是无法解决幻读,只有可串行化(Serializable)才能解决幻读,这个说法是否正确呢? 在这篇文章中,我将重点围绕MySQL中 可重复读(Repeatable read)能防住幻读吗? 这一问题展开讨论,相信看完这篇文章后,你一定会对事务隔离级别有新的认识. 我们的数据库中有如下结构和数据的 Users 表,下文中我们将对这张表进行操作, 长文预警,读完此篇文章,大概需要您二十至三十分钟. 什么是幻读? 在说幻读之前,我们要先来了解脏读和不可重复读. 脏读 当一个事务读取到另外一个事务修改但未提交的数据时,就可能发生脏读。 在我们的例子中,事务2修改了一行,但是没有提交,事务1读了这个没有提交的数据。现在如果事务2回滚了刚才的修改或者做了另外的修改的话,事务1中查到的数据就是不正确的了,所以这条数据就是脏读。 不可重复读 “不可重复读

Spring Cloud同步场景分布式事务怎样做?试试Seata

我的梦境 提交于 2019-11-29 18:18:48
一、概述 在微服务架构下,虽然我们会尽量避免分布式事务,但是只要业务复杂的情况下这是一个绕不开的问题,如何保证业务数据一致性呢?本文主要介绍同步场景下使用 Seata 的 AT模式 来解决一致性问题。 Seata 是 阿里巴巴 开源的 一站式分布式事务解决方案 中间件,以 高效 并且对业务 0 侵入 的方式,解决 微服务 场景下面临的分布式事务问题 二、Seata介绍 整体事务逻辑是基于 两阶段提交 的模型,核心概念包括以下3个角色: TM :事务的发起者。用来告诉 TC,全局事务的开始,提交,回滚。 RM :具体的事务资源,每一个 RM 都会作为一个分支事务注册在 TC。 TC :事务的协调者seata-server,用于接收我们的事务的注册,提交和回滚。 目前的 Seata 有两种模式可使用分别对应不同业务场景 2.1. AT模式 该模式适合的场景: 基于支持本地 ACID 事务的关系型数据库。 Java 应用,通过 JDBC 访问数据库。 一个典型的分布式事务过程: TM 向 TC 申请开启一个全局事务,全局事务创建成功并生成一个全局唯一的 XID 。 XID 在微服务调用链路的上下文中传播。 RM 向 TC 注册分支事务,将其纳入 XID 对应全局事务的管辖。 TM 向 TC 发起针对 XID 的全局提交或回滚决议。 TC 调度 XID

事务到底是隔离的还是不隔离的?

一个人想着一个人 提交于 2019-11-29 17:58:37
在之前很长一段时间内,对事务的隔离机制都仅仅局限在“背”这个字上,但是对于底层如何实现解决的可重复读和幻读等一系列问题还是云里雾里。这篇文章,主要还是讲述的是在不可重复读隔离级别下,多事务之间实现的一致性读和当前读以及多事务版本并发控制的细节原理,以便于加深对mysql隔离机制的理解,当然后面还会引入对mysql锁、索引机制等等的问题,慢慢来吧! 来源: https://www.cnblogs.com/Booker808-java/p/11525275.html