mysql事务

MySQL之事务

泪湿孤枕 提交于 2019-11-27 05:58:37
什么是事务? 事务是一个或一组数据库操作的集合。 事务的ACID 原子性:事务要么都做,要么都不做。如果有一个操作执行失败,其余操作必须取消执行。 一致性:事务必须从一个一致性状态变到另一个一致性状态,它和原子性是密不可分的。如果一个事务是将A的值转移到B,那么B增加的同时A必须得减少一致的数量 隔离性:即使是在并发条件下,事务也不可以被其他事务所干扰 持久性:一个事务提交成功后,对数据的改变就应该是永久的了,不可以被其他操作或故障所影响 MySQL是通过WAL方式,来保证数据库事务的一致性和持久性 WAL(Write-Ahead Logging)是一种实现事务日志的标准方法,具体而言就是: 1、修改记录前,一定要先写日志; 2、事务提交过程中,一定要保证日志先落盘,才能算事务提交完成。 通过WAL方式,在保证事务特性的情况下,可以提高数据库的性能。 日志文件:undo和redo undo用来存放修改前的数据,redo用来存放修改后的数据 假设有A、B两个数据,值分别为1,2,开始一个事务,事务的操作内容为:把1修改为3,2修改为4,那么实际的记录如下(简化): A.事务开始. B.记录A=1到undo log. C.修改A=3. D.记录A=3到redo log. E.记录B=2到undo log. F.修改B=4. G.记录B=4到redo log. H.将redo

Mysql中MVCC的使用及原理详解

房东的猫 提交于 2019-11-27 05:32:29
转载自: https://blog.csdn.net/w2064004678/article/details/83012387 准备 测试环境:Mysql 5.7.20-log 数据库默认隔离级别:RR(Repeatable Read,可重复读),MVCC主要适用于Mysql的RC,RR隔离级别 创建一张存储引擎为testmvcc的表,sql为: CREATE TABLE testmvcc ( id int( 11) DEFAULT NULL, name varchar( 11) DEFAULT NULL ) ENGINE= InnoDB DEFAULT CHARSET=utf8; 什么是MVCC? 英文全称为Multi-Version Concurrency Control,翻译为中文即 多版本并发控制。在小编看来,他无非就是乐观锁的一种实现方式。在Java编程中,如果把乐观锁看成一个接口,MVCC便是这个接口的一个实现类而已。 特点 1.MVCC其实广泛应用于数据库技术,像Oracle,PostgreSQL等也引入了该技术,即适用范围广 2.MVCC并没有简单的使用数据库的行锁,而是使用了行级锁,row_level_lock,而非InnoDB中的innodb_row_lock. 基本原理 MVCC的实现,通过保存数据在某个时间点的快照来实现的。这意味着一个事务无论运行多长时间

MYSQL面试题2

﹥>﹥吖頭↗ 提交于 2019-11-27 05:30:58
1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中; 3. 从:sql执行线程——执行relay log中的语句; 2、MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MVCC, 而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持 5>.InnoDB不支持全文索引,而MyISAM支持。 (2)、innodb引擎的4大特性 插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为myisam内部维护了一个计数器,可以直接调取。 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别 char是一种固定长度的类型

Python自学第十二周(1)

╄→гoц情女王★ 提交于 2019-11-27 05:00:11
Day13 https://www.cnblogs.com/alex3714/articles/5950372.html 数据库知识MySQL https://blog.csdn.net/jeffleo/article/details/53559712 数据库的linux安装 启动mysql服务 service mysqld start mysql -u root -p show databases; use ... show tables; desc ... #可以看表结构 也可以使用 show columns from ... select * from user\G; 创建一个支持中文的数据库 create database zach charset utf8 添加新用户(带密码的) GRANT ALL ON TEST.* TO 'zach'@'localhost' IDENTIFIED BY 'zach123'; 删除数据库 drop database ... 显示数据表的详细索引信息 show index from ... MySQL 创建数据表 CREATE TABLE table_name (column_name column_type); 创建一个student表 create table student( stu_id INT NOT NULL AUTO

MySQL两种存储引擎: MyISAM和InnoDB 简单总结

允我心安 提交于 2019-11-27 04:53:35
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction)。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。 InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。 MyISAM和InnoDB两者之间有着明显区别,简单梳理如下: 1) 事务支持 MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。 MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交

mysql数据库的隔离级别

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-27 04:45:37
1.事务的特性 ACID 1.1原子性 事务中的操作,要么全部成功,要么全部失败;对于一个事务来说,不可能只执行其中的一部分操作 1.2一致性 数据库总是从一个一致性的状态转换到另一个一致性的状态 1.3隔离性 并发过程中,事务在最终提交之前是相互隔离的,不能相互干扰 1.4持续性 一旦事务提交,则其所做的修改不会永久保存到数据库 2事务并发产生的问题 2.1脏读 事务A第一次读取到price=100 同时事务B更新update price=120,但是此时的事务B还未commit 事务A读取的price=120 事务B->rollback操作 事务A读取到的是脏数据 2.2不可重复读 事务A第一次读取到price=100 同时事务B更新update price=120,并commit 事务A读取的price=120 事务A多次读取的结果不一致 2.3幻读 幻读和不可重复读的区别在于,幻读主要表现在数据的 删除 和 插入 ,而不可重复读表现在数据的 更新 事务A第一次读取到price=100 同时事务B更新delete price=100 这条记录,并commit 事务A读取的price=100 price这条记录已经不存在,但是事务A还是可以读取到 3数据库提供的解决方法 mysql提供了4种隔离级别 3.1read uncommitted 未提交读 2.1中 脏读 的场景

Innodb索引和锁的学习笔记

被刻印的时光 ゝ 提交于 2019-11-27 04:36:28
附录:前段时间学习了下innodb锁的相关知识,对锁和事务有了大体理解,这里做个小总结。 1.Innodb事务和锁的关系。 Innodb区别于MyISAM的两个特点就是Innodb对于事务的支持和对行锁的支持。事务要求了一组SQL语句的ACID特性,同时为了避免对一行记录的并发更新,innodb本身会在一定情况下加锁,然后等语句所在的事务退出后(rollbak或者commit)释放锁。其实在autocommit=true时,一个sql本身就是一个事务。 Innodb在执行Update,Delete,Insert时会对记录加写锁(排他锁,加上排他锁后,不能再加共享锁和排他锁)。而Select语句不会对记录加锁。 共享锁:SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE。 举例: 如图,左侧事务加了排他锁(for update),右侧事务直接查询不会等待(不加锁),加排他锁失败,加共享锁失败(lock in share mode)。左侧事务提交或者回滚后,释放锁。 2.Innodb的行锁特性。 Innodb使用行锁加锁记录,也就是说会在加锁条件下对访问的具体行进行加锁,而不会锁住全表。这样能够大大提高表访问的吞吐量

MySQL Innodb表导致死锁日志情况分析与归纳

两盒软妹~` 提交于 2019-11-27 04:36:18
案例描述 在定时脚本运行过程中,发现当备份表格的sql语句与删除该表部分数据的sql语句同时运行时,mysql会检测出死锁,并打印出日志。 两个sql语句如下: (1)insert into backup_table select * from source_table (2)DELETE FROM source_table WHERE Id>5 AND titleWeight<32768 AND joinTime<'$daysago_1week' teamUser 表的表结构如下: PRIMARY KEY (`uid`,`Id`), KEY `k_id_titleWeight_score` (`Id`,`titleWeight`,`score`), ENGINE=InnoDB 两语句对source_table表的使用情况如下: 死锁日志打印出的时间点表明,语句(1)运行过程中,当语句(2)开始运行时,发生了死锁。 当mysql检测出死锁时,除了查看mysql的日志,还可以通过show InnoDB STATUS \G语句在mysql客户端中查看最近一次的死锁记录。由于打印出来的语句会很乱,所以,最好先使用pager less命令,通过文件内容浏览方式查看结果,会更清晰。(以nopager结束) 得到的死锁记录如下: 根据死锁记录的结果,可以看出确实是这两个语句发生了死锁

Mysql 中需不需要commit

喜你入骨 提交于 2019-11-27 03:56:59
摘自:https://blog.csdn.net/zzyly1/article/details/81003122 mysql在进行增删改操作的时候需不需要commit,这得看你的存储引擎, 如果是不支持事务的引擎,如myisam,则是否commit都没有效的。 如果是支持事务的引擎,如innodb,则得知道你事物支持是否自动提交事务(即commit) 看自己的数据库是否是自动commit,可以使用mysql> show variables like '%autocommit%';来进行查看,如果是OFF即不自动commit,需要手动commit操作(命令行可以直接“commit;“命令),否则是自动commit。 来源: https://www.cnblogs.com/xinruyi/p/11343199.html

spring 事务案例--转账

*爱你&永不变心* 提交于 2019-11-27 03:48:05
spring 事务案例--转账 1 环境搭建 1.创建表 create databases spring_date; use spring_date; create table account( id int primary key auto_increment, username varchar(50), money int); insert into account(username,money) values('jack','10000') insert into account(username,money) values('rose','10000') 2.导入jar包 核心 4+1 aop:4 (aop联盟,spring aop,aspectj,spring aspectj) 数据库 2 (jdbc ,tx) 驱动 mysql 连接池 c3p0 3.dao层 package com.itheima.dao; import org.springframework.jdbc.core.support.JdbcDaoSupport; public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao{// 继承JdbcDaoSupport,之后只需要注入数据源,底层自动创建模板 @Override