mysql事务

事务与锁

余生长醉 提交于 2019-12-03 07:08:51
事务 初学的时候,感觉事务的四大特性就那么回事,不就是一堆事要么完成,要么全部失败吗。还有经常说的脏读,幻读,不可重复读根本无法理解,就是那个存款取款的例子,我修改了数据,对方看到我修改的数据,这不很正常吗。现在看来,当时根本就不知道并发是什么鬼,更何谈并发事物了。 然后给你来一堆名词,共享锁,排它锁,悲观锁,乐观锁...... 想想就觉得那时候能记下来已经是奇迹了。 Spring 还给事务弄了一个传播机制的家伙, Spring 事务传播机制可以看这篇文章 。 本文应该来说是对初学者的福音,有一定经验的人看的话应该也会有收获。 事务的四大特性ACID 这个是刚入门面试的时候必问一个面试题,刚入行的时候我是硬生生背下来的。 原子性(Atomicity) 一件事情的所有步骤要么全部成功,要么全部失败,不存在中间状态。 一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(Isolation) 两个事务之间是隔离程度,具体的隔离程度由隔离级别决定,隔离级别有 读未提交的 (read-uncommitted) 读提交的 (read-committed) 可重复读 (repeatable-read) 串行 (serializable) 持久性 (Durability) 一个事务提交后

(转)MySQL 加锁处理分析

跟風遠走 提交于 2019-12-03 05:33:51
> 文章首发于: clawhub.club 1、概念 死锁是指两个或两个以上的事务在执行过程中,因争夺锁资源而造成的一种相互等待的现象。 具体的介绍可以参考我以前写的一篇文章: 【并发编程挑战】死锁 2、死锁检测 以下文字全部摘抄整理自《MySQL技术内幕 InnoDB存储引擎 第二版》,在InnoDB存储引擎中,采用wait-for graph(等待图)的方式来进行死锁检测。 wait-for graph要求数据库保存一下两种信息: 锁的信息链表 事务等待链表 通过上述链表可以构造出一张图,而在这个图中若存在回路,就代表存在死锁,因此资源间相互发生等待。在wait-for graph中,事务为图中的节点。在图中,事务T1指向T2定义为: 事务T1等待事务T2所占用的资源 事务T1发生在事务T2后面 事务T2所占用的资源不会被强制剥夺 下面通过一个例子分析,当前事务与锁的状态如下图: 由图可知: 事务等待列表中有4个事务,在wait-for graph中对应4个节点。 事务t2对row1(行)占用x锁(独占锁),事务t1对row2(行)占用s锁(共享锁) 事务t1等待事务t2所占用的row1资源,因此在wait-for graph中有条边从节点t1指向t2。 事务t2等待事务t1、t4所占用的row2资源,t4对于row2占用s锁。故存在t2指向t1、t4的边。 同样

MySQL数据库5事务、视图、触发器、函数、数据库的备份

时光怂恿深爱的人放手 提交于 2019-12-03 05:19:33
目录 一、事务(important) 1.1什么是事务? 1.2解决办法 1.2.1事务的语法 1.2.2使用事务解决转账问题代码演示 1.2.3rollback 1.3事务的特性(important) 二、存储引擎(important) 2.1 innodb 2.2 myisam 2.3两种引擎的区别 三、视图 四、触发器 4.1简述 4.2用法 4.2.1增加 4.2.2删除 五、存储过程 5.1存储过程的创建 5.2存储过程的删除 六、函数 七、数据库的备份 7.1数据库的备份 7.2数据库的导入 也许人生就是这样,我们花大把时间迷茫,然后在几个瞬间成长。——无意间看到的一句话 一、事务(important) 1.1什么是事务? 事务指一组操作要么成功要么失败,在成功修改数据前原来的数据不会受影响,如果修改成功则数据将被更改,如果失败,则原数据库数据不变。 思考:银行转账,转账人如果已经进行了转账操作,而在对方还未收到转账时如果发生网络故障,对方没有收到钱,这个转着账如何处理?这时候就用到了事务,转账要么成功,两边数据都修改,要么失败,两边的数据都不变。 代码演示 create table user ( id int auto_increment primary key , name varchar (32) not null default '', salary int

MySQL 05

空扰寡人 提交于 2019-12-03 05:19:04
目录 事务 基本概念 四大特性(ACID) 使用方法 存储引擎 视图 基本概念 使用方法 触发器 基本概念 使用方法 存储过程 基本概念 使用方法 数据备份 备份 导入 函数 事务 基本概念 事务: Transaction 事务是由一个或多个sql语句构成的逻辑单元, 是一个整体的概念 作用 : 使得一系列sql语句要么全部完成, 要目全部不完成, 保证了数据库的完整性 四大特性(ACID) 原子性 ( A tomicity): 事务是最小执行单位, 不可再分, 既一个事务中的所有操作, 要么全部完成, 要么全部不完成 一致性 ( C onsistency): 事务开始之前和结束之后, 数据库的完整性没有被破坏 隔离性 ( I solation): 数据库支持多个事务并发, 隔离性可以防止事务交叉执行导致的不一致 读未提交 读提交 可重复读 串行化 持久性 ( D urability): 事务处理结束后, 对数据的修改时永久的 使用方法 start transaction; 开启 commit; 提交 rollback; 回滚 第一步: 开启事务, 执行操作 # alpha 对 bravo 转账 100 mysql> select * from balance; +----+-------+-------+ | id | name | money | +----+-------+-

1101 笔记

*爱你&永不变心* 提交于 2019-12-03 05:12:45
目录 1. 事务 为什么要使用 使用 特性 原子性 一致性 隔离性 持久性 2.存储引擎 InnoDB MYIsam 区别 3.视图 定义 增加视图 查看视图 删除视图 4.触发器 语法 增加触发器 查看触发器 删除触发器 5.存储过程 定义 优点 缺点 总结 语法 创建 使用 删除 6.函数 7.数据库备份 语法 1. 事务 mysql主要用于处理操作量大,复杂度高的数据,比如在人员管理系统 你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! 在mysql中只有使用了InnoDB数据库引擎的数据库或表才支持事务 事务处理可以维护数据库的完整性,保证成批的sql语句要么全部执行,要么全部不执行 事务用来管理insert,update,delete语句 为什么要使用 很多时候一个数据操作,不是一个sql语句就完成的,可能有很多个sql语句,如果部分sql执行成功而部分sql执行失败将导致数据错乱 eg: 转账 == 转入转出均成功,才能认为操作成功 使用 开启事务: start transaction sql语句: 提交: commit 回滚: rollback // 影响所有,回滚到初始 start transaction; --开启事物,在这条语句之后的sql将处在同一事务,并不会立即修改数据库

Day 37 SQL基础(五)

牧云@^-^@ 提交于 2019-12-03 05:01:07
目录 事务处理 开始事务 回滚事务 提交事务 事务的特性 存储引擎 什么是存储引擎 各存储引擎的特性 概览 各种存储引擎的特性 各存储引擎的介绍 视图 创建视图 删除视图 修改视图 触发器 创建触发器 删除触发器 存储过程 创建无参存储过程 创建有参存储过程 执行存储过程 删除存储过程 SQL函数 事务处理 事务用于将某些操作的多个SQL作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性 开始事务 start transaction 标识事务的开始 回滚事务 rollback 用来回退(撤销)SQL语句 select * from users; start transaction; update users set age = 18 where id = 120; delete from users where name = 'tiny'; rollback; select * from users; rollback只能在一个事务处理内使用,在执行一条start transaction命令之后 提交事务 commit 一般的MySQL语句都是直接针对数据库表执行和编写的.这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的. 但是.在事务处理块中,提交不会隐含地进行.为进行明确的提交,使用commit语句 start transaction;

事务视图存储过程触发器数据备份

╄→尐↘猪︶ㄣ 提交于 2019-12-03 04:57:27
目录 事务 事务的特性 原子性(Atomicity): 一致性(Consistency): 隔离性(Isolation): 持久性(Durability): 存储引擎 InnoDB :保时捷引擎 MyIsam:奔奔引擎 视图 使用 增加视图 删除视图 触发器 存储过程 创建 函数 数据库的备份 语法 示列 事务 通俗的说,事物指一组操作,要么都执行成功,要么都执行失败 使用事务: start transactino sql语句 commit/rowllback # 演示: mysql> select * from t1; +----+------+--------+ | id | name | salary | +----+------+--------+ | 1 | aa | 1000 | | 2 | bb | 2000 | | 3 | dd | 3000 | +----+------+--------+ mysql> start transaction; mysql> update t1 set salary=100 where name='aa'; mysql> select * from t1; +----+------+--------+ | id | name | salary | +----+------+--------+ | 1 | aa | 100 | | 2

记一次处理MySql锁等待(Lock wait timeout exceeded)

允我心安 提交于 2019-12-03 04:53:56
环境 MySQL5.5 现象 A.数据更新或新增后数据经常自动回滚。 B.表操作总报 Lock wait timeout exceeded 并长时间无反应 解决方法 A.应急方法: show processlist; kill掉出现问题的进程 B.根治方法: select * from innodb_trx 查看有是哪些事务占据了表资源。 C.我的方法:设置MySQL锁等待超时 innodb_lock_wait_timeout=50 ,autocommit=on 该类问题导致原因 据我分析,Mysql的 InnoDB存储引擎是支持事务的,事务开启后没有被主动Commit。导致该资源被长期占用,其他事务在抢占该资源时,因上一个事务的锁而导致抢占失败!因此出现 Lock wait timeout exceeded 接下来是转载的内容 转载: http://blog.sina.com.cn/s/blog_6bb63c9e0100s7cb.html MySQL 5.5 -- innodb_lock_wait 锁 等待 记得以前,当出现:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction, 要解决是一件麻烦的事情 ; 特别是当一个SQL执行完了,但未COMMIT,后面的SQL想要执行就是被锁

SQL引擎及事务支持

北慕城南 提交于 2019-12-03 04:53:47
查看当前表引擎 SHOW CREATE TABLE table_name MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。 更改MyISAM类型表为InnoDB类型的表 ALTER TABLE table_name ENGINE=InnoDB; ALTER TABLE table_name ENGINE=MyISAM; 一次修改多个表 #修改为InnoDB SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' ENGINE=InnoDB;' ) FROM information_schema.tables WHERE table_schema = 'DBNAME' LIMIT 0 , 10000;#修改为MyISAM SELECT CONCAT( 'ALTER TABLE ', TABLE_NAME, ' ENGINE=MyISAM;' ) FROM information_schema.tables WHERE table_schema = 'DBNAME' LIMIT 0 , 10000; 使用说明: 1. 将以上SQL语句中的 DBNAME 替换成需要修改的数据库名称。 2.

MySQL SELECT ... FOR UPDATE

眉间皱痕 提交于 2019-12-03 04:52:03
MySQL 使用SELECT ... FOR UPDATE 做事务写入前的确认 以MySQL 的InnoDB 为例,预设的Tansaction isolation level 为REPEATABLE READ,在SELECT 的读取锁定主要分为两种方式: SELECT ... LOCK IN SHARE MODE SELECT ... FOR UPDATE 这两种方式在事务(Transaction) 进行当中SELECT 到同一个数据表时,都必须等待其它事务数据被提交(Commit)后才会执行。而主要的不同在于LOCK IN SHARE MODE 在有一方事务要Update 同一个表单时很容易造成死锁 。 简单的说,如果SELECT 后面若要UPDATE 同一个表单,最好使用SELECT ... UPDATE。 举个例子: 假设商品表单products 内有一个存放商品数量的quantity ,在订单成立之前必须先确定quantity 商品数量是否足够(quantity>0) ,然后才把数量更新为1。 不安全的做法: SELECT quantity FROM products WHERE id=3; UPDATE products SET quantity = 1 WHERE id=3; 为什么不安全呢? 少量的状况下或许不会有问题,但是大量的数据存取「铁定」会出问题。