mysql事务

mysql小白→高手

淺唱寂寞╮ 提交于 2019-11-28 03:32:40
mysql数据库 官方网站:https://dev.mysql.com; MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。 什么是事务 事务:数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作; 事务是一组不可再分割的操作集合(工作逻辑单元); 典型事务场景(转账): update user_account set balance = balance - 1000 where userID = 3; update user_account set balance = balance +1000 where userID = 1; mysql中如何开启事务: begin / start transaction -- 手工 commit / rollback -- 事务提交或回滚 set session autocommit = on/off; -- 设定事务是否自动开启 JDBC 编程事务开启: connection.setAutoCommit(boolean); 特性: 原子性(Atomicity) 最小的工作单元,整个工作单元要么一起提交成功,要么全部失败回滚; 一致性(Consistency)

分布式事务atomikos使用

こ雲淡風輕ζ 提交于 2019-11-28 03:32:09
atomikos+jta+JdbcTemplate 依赖包(部分) <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.1.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.1.5.RELEASE</version> </dependency> <dependency> <groupId>org

面试题总结:可能是全网最好的MySQL重要知识点

为君一笑 提交于 2019-11-28 03:17:20
标题有点标题党的意思,但希望你在看了文章之后不会有这个想法——这篇文章是作者对之前总结的 MySQL 知识点做了完善后的产物,可以用来回顾MySQL基础知识以及 备战MySQL常见面试问题 。 什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public License) 的许可下下载并根据个性化的需要对其进行修改。MySQL的默认端口号是 3306 。 事务相关 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。事务就是保证这两个关键操作要么都成功,要么都要失败。 事物的四大特性(ACID)介绍一下? 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性:

事务的四种隔离级别

﹥>﹥吖頭↗ 提交于 2019-11-28 03:17:16
事务的四种隔离级别 数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的 并发操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。 Read uncommitted 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。 事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。 分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是 脏读。 那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。 Read committed 读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交

MySQL(面试题)

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

MySQL常用配置参数说明

谁说我不能喝 提交于 2019-11-28 01:47:35
1、sync_binlog sync_binlog=0 ,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。 这个是性能最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。 sync_binlog=1 ,当每进行1次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。 sync_binlog=n ,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。 对高并发系统来说,sync_binlog设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。 2、innodb_flush_log_at_trx_commit innodb_flush_log_at_trx_commit=0 , 每隔一秒把log buffer刷到文件系统中(os buffer) ,并调用文件系统的“flush”操作将缓存刷新到磁盘上去。 也就是说 一秒之前的日志都保存在日志缓冲区 ,如果机器宕掉,可能丢失1秒的事务数据。 innodb_flush_log_at_trx_commit=1

MySQL数据库和SQL优化与JDBC

不打扰是莪最后的温柔 提交于 2019-11-28 01:28:20
为什么InnoDB支持事务而myisam不支持 MyISAM: 这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量的SELECT,MyISAM是更好的选择。 InnoDB: 这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 SQL语句中关于查询语句的优化你们是怎么做的? 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 尽量避免在 where 子句中使用 or 来连接条件

Spring使用注解进行事务管理

耗尽温柔 提交于 2019-11-28 00:56:57
一、在spring配置文件中加入命名空间 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 二、spring配置文件 <!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 数据源

mysql 事务隔离级别

删除回忆录丶 提交于 2019-11-28 00:49:27
一、事务基本要素 1.原子性( Atomicity ):事务开始所有操作后,要么全部做完,要么全部不做,不会停留在中间的某一个 环节。事务执行过程中失败,会回滚到原来的状态,就像什么都没有发生过一样。也就是所有的事务操作都是一个不可分割的整体,就像化学中基本元素单位一样。 2.一致性:事务开始和结束后,数据库完整性没有被破坏。例如A向B转账,不会出现A扣了钱,B没有收到。 3.隔离性:同一时间只允许一个事务请求同一个数据,不同事务之间互不干扰,比如A正在从银行卡取钱,在A取钱事务没有结束钱,B向A转账的事务不可以进行。 4.持久性:事务结束后事务操作数据会被保存在数据库中,不允许回滚。 二、事务的并发问题 1.脏读:事务A读到B更新的数据,B回滚,A读到的数据就是脏数据。 2.幻读:系统管理员A整理数据统计报表,管理员B向数据库库中插入一条数据,管理员A统计结束后发现有一条数据没有被统计进来就像产生了幻觉一样这就是幻读。 3.不可重复读:事务A再某一时刻重复读取某一数据,在事务A重复读取数据的过程中,事务B将A读取的数据更新修改并提交,这就导致事务A多次读取的数据不一致。 小结:不可重复读和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增和删除。解决不可重复读问题只需锁住满足条件的行,解决幻读问题需要锁表。 三、事务隔离级别 事务隔离级别 脏读 不可重复读 幻读 读未提交

MySQL 事务隔离级别

杀马特。学长 韩版系。学妹 提交于 2019-11-28 00:49:22
隔离性 隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的。 SQL标准中定义了四种隔离级别: 未提交读 已提交读 可重复读 可串行化 下面来详细说明一下这四种隔离级别。 未提交读 (READ UNCOMMITED) 在未提交读这种隔离级别中,对数据的修改,即使还未提交,对其他的事务也是可见的。事务可以读取未提交的数据,也称之为“脏读”,读到的数据被称之为“脏数据”。未提交之前,数据是不准确的,可能会被回滚,也可能还有后续操作的变化。 之前在使用SQLserver时,经常会建议,查询的时候在from子句加上WITH(NOLOCK)。这个关键字的作用就是进行脏读。这是由于在老版本的SQLserver中,是不支持非锁定读的。现在在新版本的SQLserver中可以进行非锁定读了。允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改。 举个栗子 :老板给员工发工资,实际发6千,一手抖按了9千,这时员工账户的数据已经发生了更改,但是事务还没提交。员工一查,自己多了3千块钱,以为是涨工资了,过去谢谢老板。老板一看不对啊,我按错了,回滚事务,重新给发6千。小伙纸欲哭无泪。 已提交读(READ COMMITED) 这个隔离级别是大多数操作系统的默认隔离级别,也是平时用的最多的隔离级别。常见的Oracle、SQLserver等,但是MySQL是个例外