mysql事务

MySQL 常见的两种存储引擎

纵然是瞬间 提交于 2020-01-26 14:26:46
  MySQL两种常见的存储引擎有:MyISAM 和 InnoDB,两者区别如下: 1、count运算:MyISAM 有缓存表的 meta-data 元数据,元数据包括行数等,因此其做 COUNT(*) 查询时不需要消耗多少资源。而 InnoDB 就没有这个缓存。 2、事务和崩溃后的安全恢复:MyISAM强调的是性能,每次查询具备原子性,执行速度比 InnoDB 更快,但是 MyISAM 不提供事务的支持。而 InnoDB 支持事务、外部键等高级数据库功能。具有事务提交(commit)、回滚(rollback)和崩溃修复(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。 3、支持外键:InnoDB支持,MyISAM 不支持。   MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。 一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务时,MyISAM是最好的选择。 来源: https://www.cnblogs

MySQL8.0新特性【转】

China☆狼群 提交于 2020-01-26 11:50:32
Server层,选项持久化 mysql> show variables like '%max_connections%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | max_connections | 512 | | mysqlx_max_connections | 100 | +------------------------+-------+ 2 rows in set (0.00 sec) mysql> set persist max_connections=8000; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%max_connections%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | max_connections | 8000 | | mysqlx_max_connections | 100 | +------------------------+-------+ 2 rows

MySQL事务和锁的相关概念

断了今生、忘了曾经 提交于 2020-01-26 11:38:47
大家肯定都打过游戏,对于一个游戏通关来说,通了就是通了,没通就是没通。 那对于事务来讲,一组 SQL 语句全部执行成功才是成功,只要有一个 SQL 语句执行失败,整个就崩掉了。 1)事务的概念 2)事务的特性 3)事务的隔离级别 4)锁 5)一些事务相关的 SQL 语句 6) MySQL 中常使用的引擎 1、什么是事务 事务是有一条或者是多条对数据库操作的SQL组成的一个不可分割的单元, 只有当事务中的所有的操作都正常执行时,整个事务才提交给数据库 1)事务是一组SQL语句的执行,要么全部执行成功,要么全部执行失败, 不能出现部分成功和失败,保证原子操作 2)事务中所有的数据执行成功,才能提交( commit )事务,把结果写入磁盘 3)事务在执行过程中,有的SQL出现了错误,那么事务必须回滚( rollback ) 到最初的状态 当一个事务正确提交后,那个值才会刷新到磁盘上。 2、事务的一些性质 事务的ACID特征: 一个事务必须满足以下4个特征: A(Atomic):原子性 事务是一个不可分割的整体,事务必须具有原子特性,当数据发生变更时,要么全部成功,要么全部失败,不存在部分成功和失败 通关与未通关 C(Consistency):一致性 一个事务的执行前后,数据库中的数据必须保持一致性的特征。 I(Isolation):隔离性 当两个或者多个事务进行并发操作时

spring整合mybatis

允我心安 提交于 2020-01-26 08:18:47
spring整合mybatis的applicationContext.xml <?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:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http:

事务并发的可能问题与其解决方案

戏子无情 提交于 2020-01-26 02:47:01
一、事务并发的问题 这些问题可以归结为5类,包括3类数据读问题( 脏读、 不可重复读和 幻象读)以及2类数据更新问题( 第一类丢失更新和 第二类丢失更新) 脏读(dirty read) A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。来看取款事务和转账事务并发时引发的脏读场景: 在这个场景中,B希望取款500元而后又撤销了动作,而A往相同的账户中转账100元,就因为A事务读取了B事务尚未提交的数据,因而造成账户白白丢失了500元。在Oracle数据库中,不会发生脏读的情况。 不可重复读(unrepeatable read) 不可重复读是指 A事务读取了B事务已经提交的更改数据。 假设A在取款事务的过程中,B往该账户转账100元,A两次读取账户的余额发生不一致: 这个就我自己觉得问题不大,好像也并没有影响什么。 幻象读(phantom read) A事务读取B事务提交的新增数据,这时A事务将出现幻象读的问题。幻象读一般发生在计算统计数据的事务中,举一个例子,假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计过程中,刚好新增了一个存款账户,并存入100元,这时,两次统计的总金额将不一致: 如果新增数据刚好满足事务的查询条件,这个新数据就进入了事务的视野,因而产生了两个统计不一致的情况。 不可重复读 和

数据库的事务与锁初理解

孤者浪人 提交于 2020-01-25 21:41:02
前沿: 以下内容大多来自以下三篇文章 Mysql事务与锁详解 MySqL 事务与锁的深入学习笔记 Mysql事务实现原理 (很推荐看下) 对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X); 对于一般的select语句,InnoDB不会加任何锁 ,事务可以通过以下语句给显式的加共享锁或排他锁。 -- 共享锁: SELECT * from tb_user LOCK IN SHARE MODE ; -- 排他锁: SELECT * from tb_user FOR UPDATE ; 共享锁(S) 排它锁(X) 若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行 加任何锁 (如何执行的语句没有锁,那么就不会影响, 比如默认的select语句就是没有任何锁的 ),其他进程可以读取,不能进行写操作,需等待其释放。 排它锁是悲观锁的一种实现 执行存储过程,开启事务,但是不提交,即锁一直在 CREATE DEFINER = ` root ` @`localhost` PROCEDURE ` NewProc ` ( ) BEGIN start transaction ; set session transaction isolation level read committed ; SELECT name

面试常考的mysql知识点

混江龙づ霸主 提交于 2020-01-25 14:44:28
秋招之后,部门又来了好多小鲜肉,其中有部分同学是没有用过MySQL的,我把自己以前做过的笔记又重新整理了一番,希望能够对新同学有帮助! 什么是DML、DDL、DCL? DML (data manipulation language): 它们是SELECT、UPDATE、INSERT、DELETE,就象它的名字一样,这4条命令是 用来对数据库里的数据进行操作的语言 DDL (data definition language):主要的命令有CREATE、ALTER、DROP等, DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用 DCL (Data Control Language):是 数据库控制功能。 是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句 。在默认状态下,只有sysadmin,dbcreator,db_owner或db_securityadmin等人员才有权力执行DCL TCL (Transaction Control Language): 事务控制语言 ,包括:set transaction\rollback\savepoin MySQL常用命令 DDL 创建数据库 create database 数据库名; 查看数据库列表 show databases;

MySQL性能优化 -- 服务器配置优化

落花浮王杯 提交于 2020-01-25 05:34:26
常用查看性能参数的方法 show variables:查看服务器一些静态的参数,如缓冲区大小,字符集,数据文件名称等信息。 show rariables:查看的是MySQL启动之前已经配置号的一些系统静态参数。 show status:查看服务器运行中的状态信息,如当前连接数,锁等状态信息。 1、key_buffer_size的设置: 该参数用来设置索引块缓存的大小,只使用于MyISAM存储引擎,对MyISAM表性能影响最大的一个参数。 MySQL5.1以后提供多个key_buffer,可以将指定的表索引缓存到指定的key_buffer中,这样可以更好的降低线程之间的竞争。 常用操作: 查询缓存大小:show variables like ‘key_buffer_size’; 设置多个key_buffer:set global hot_cache2.key_buffer_size=128*1024; 将相关表的索引放到指定的索引缓存中:cache index t,t2 in hot_cache2; 将表t的索引加载到默认的缓存中:load index into cache t; 删除索引缓存:set global hot_cache2.key_buffer_size=0; 值得注意的是,不能删除默认的索引缓存区! cache index可以将多个表的索引加载到指定的索引缓冲区中

用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景?

不羁岁月 提交于 2020-01-25 03:42:12
1. 数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 2. 数据源没有配置事务管理器 @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } 如上面所示,当前数据源若没有配置事务管理器,那也是白搭! 3. 没有被 Spring 管理 如下面例子所示: // @Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { // update order } }

mysql锁

こ雲淡風輕ζ 提交于 2020-01-24 22:41:23
文章目录 锁 一、全局锁 二、表锁 三、行锁 锁 一、全局锁 Flush tables with read lock;当前客户端断开连接时候,锁就会去除; 二、表锁 lock tables t1 read,t2 wirte; 这个语句,则其他线程写t1、读写t2的语句都会被阻塞。同时,线程A在执行unlock tables之前,也只能执行读t1、读写t2的操作 如果安全地给小表加字段? 首先要解决长事务,事务不提交,就会一直占着DML锁。在MySQL的information_schema库的innodb_trx表中,可以查到当前执行的事务。如果要做DDL变更的表刚好有长事务在执行,要考虑先暂停DDL,或者kill掉这个长事务 如果要变更的表是一个热点表,虽然数据量不大,但是上面的请求很频繁,而又不得不加个字段,该怎么做? 在alter table语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后面的业务语句,先放弃。之后再通过重试命令重复这个过程 三、行锁 1.MySQL的行锁是在引擎层由各个引擎自己实现的。但不是所有的引擎都支持行锁,比如MyISAM引擎就不支持行锁 2.行锁就是针对数据表中行记录的锁。比如事务A更新了一行,而这时候事务B也要更新同一行,则必须等事务A的操作完成后才能进行更新 两阶段锁 在一个事务里面,分为加锁(lock