转载:http://blog.csdn.net/qq_26525215/article/details/52146529

MySQL 事务处理

简单介绍事务处理:

MySQL 事务主要用于处理操作量大,复杂度高的数据。 
比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

一个事务是一个连续的一组数据库操作,就好像它是一个单一的工作单元进行。换言之,永远不会是完整的事务,除非该组内的每个单独的操作是成功的。如果在事务的任何操作失败,则整个事务将失败。

事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行

事务用来管理多条insert,update,delete语句

一般来说,事务是必须满足4个条件(ACID): 
Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)

1、事务的原子性:一组事务,要么成功;要么撤回。 
2、稳定性 : 有非法数据(外键约束之类),事务撤回。 
3、隔离性:事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。 
4、可靠性:软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit选项 决定什么时候把事务保存到日志里。

开始一个事务

start transaction
  • 1
  • 1

在MySQL中,事务开始使用COMMIT或ROLLBACK语句开始工作和结束。开始和结束语句的SQL命令之间形成了大量的事务。

COMMIT & ROLLBACK: 
这两个关键字提交和回滚(撤销事务)主要用于MySQL的事务。

当一个成功的事务完成后,发出COMMIT命令应使所有参与表的更改才会生效。

如果发生故障时,应发出一个ROLLBACK命令返回的事务中引用的每一个表到以前的状态。

可以控制的事务行为称为AUTOCOMMIT设置会话变量。如果AUTOCOMMIT设置为1(默认值),然后每一个SQL语句(在事务与否)被认为是一个完整的事务,并承诺在默认情况下,当它完成。 AUTOCOMMIT设置为0时,发出SET AUTOCOMMIT =0命令,在随后的一系列语句的作用就像一个事务,直到一个明确的COMMIT语句时,没有活动的提交。

Java中setAutoCommit(false)对应mysql中的“START TRANSACTION;”的功能

SQL代码演示说明:

start transaction;
delete from aa where id='7';
update aa set sname='aaaa' where id='5';
rollback;/*事务回滚-执行失败*/
/*commit;提交事务-执行成功*/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

说明:从”start transaction”开始 到 “bollback; 或 commit; ”,这中间的那么语句是一个整体,如果执行 “bollback”,那么这些动作都会回滚(撤消)。如果执行“commit”,就全部执行成功。

Java代码演示:

@Testpublic void transactionDemo() throws ClassNotFoundException, SQLException{//1、加载连接器(驱动)  Driver Class.forName("com.mysql.jdbc.Driver");//2、建立连接String url  = "jdbc:mysql://127.0.0.1:3306/hncu?useUnicode=true&characterEncoding=utf-8";Connection con = DriverManager.getConnection(url, "root", "1234");//3、获取语句对象Statement st = con.createStatement();//4、下面为Java实现事务处理try {con.setAutoCommit(false);//从设置false开始,以下都是一个事务String sql = "insert into aa values(1,'张三');";st.execute(sql);//增sql = "delete from aa where id = 5";st.execute(sql);//删sql = "update aa set sname='rose111' where id=6";st.execute(sql);con.commit();//提交} catch (Exception e) {con.rollback();//如果出现异常,我们就让事务回滚} finally{con.setAutoCommit(true);//再设置回去con.close();}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

事务隔离级别(加锁):

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

查询事务隔离级别:

select @@tx_isolation;
  • 1
  • 1

Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,被称之为脏读(Dirty Read)。

测试流程:
1、A设置read-uncommitted, start transaction
设置事务隔离级别(read-uncommitted):
set session transaction isolation level read uncommitted;
2、B执行start transaction,再修改一条记录,
3、A查询记录,得到了以为正确的记录
4、B回滚。
问题:A读到了B没有提交的记录,也就是脏读。 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。

这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

不可重复读(nonrepeatable read): 
一个从开始直到提交之前所做的任何修改对其它事务都是不可见的。两次同样的查询可能会得到不一样的结果。

测试流程:
1、A设置read-committed, start transaction
设置事务隔离级别(read-committed):
set session transaction isolation level read committed;
2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功
3、A查询记录,结果还是老的记录
4、B提交事务
5、A再次查询记录,结果是新的记录。
问题:两次查询结果不一致,也就是不可重复读问题。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Repeatable Read(可重读)-MySQL的默认事务隔离级别

它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。

保证了在同一事务中多次读取结果是一致的。但会引起另外一个幻读问题,当某个事务在读取某个范围记录时,另外一个事务在该范围插入和新记录,当之前事务再次读取该范围记录时会产生幻行。

测试流程:
1、A设置repeatable-read, start transaction,查询记录,结果是老的记录
设置事务隔离级别(repeatable-read,MySQL默认):
set session transaction isolation level repeatable read;
2、B执行start transaction,修改一条记录,查询记录,记录已经修改成功
3、A查询记录,结果还是老的记录
4、B提交事务
5、A再次查询记录,结果还是老的记录。
问题:可以重复读,A在事务过程中,即使B修改了数据,并且commit,A读取的还是老的数据。即可重复读。
注意:这里可能会存在一个新的问题,A在事务过程中,B增加一条记录,并提交,导致A的两次读取不一致,会多一条记录,也就是幻影读。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

测试流程:
1、A设置serializable, start transaction,查询记录,结果是老的记录
设置事务隔离级别(serializable,最高级别):
set session transaction isolation level serializable;
2、B执行start transaction,修改一条记录,B卡在这里,要等待A完成才行。
3、A查询记录,结果还是老的记录,A提交。
4、B的修改操作才进行下去。
注意:B在等待过程中,会出现lock超时。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

小知识点:

共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
  • 1
  • 2
  • 1
  • 2

查看当前隔离级别:

select @@tx_isolation;
  • 1
  • 1

设置隔离级别语法:

set [session | global] transaction isolation level {read uncommitted | read committed | repeatable read | serializable}
  • 1
  • 1

这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack(回滚)了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

MySQL事务处理与事务隔离(锁机制)相关推荐

  1. mysql 事务 不同库_MYSQL数据库重点:事务与锁机制

    一.事务 一组连续的数据库操作,每一次操作都成功,整个事务就成功,只要有一步出错,整个事务就失败: MySQL事务与存储引擎相关 1.MyISAM:不支持事务,用于只读程序提高性能 2.InnoDB: ...

  2. mysql中不同事务隔离级别下数据的显示效果--转载

    事务是一组原子性的SQL查询语句,也可以被看做一个工作单元.如果数据库引擎能够成功地对数据库应用所有的查询语句,它就会执行所有查询,如果任何一条查询语句因为崩溃或其他原因而无法执行,那么所有的语句就都 ...

  3. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  4. 【转】事务和锁机制是什么关系? 开启事务就自动加锁了吗?

    数据库锁 因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对同一张表进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了 ...

  5. MySQL中的事务与锁

    这篇文章详细介绍一下数据库事务与锁的相关知识.主要是一些概念性的东西看起来可能比较乏味,但作为一名合格的程序员来说,你应该掌握也必须掌握.这些理论知识好比是一个人的内功,我们平时敲代码是外功,只有内外 ...

  6. 事务,Oracle,MySQL及Spring事务隔离级别

    一.什么是事务:  事务逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. 二.事务特性(4种):  原子性 (atomicity):强调事务的不可分割: 一致性 (consi ...

  7. Redis的事务和锁机制(乐观锁和悲观锁)

    Redis学习笔记(四) 1,Redis事务的定义 2,Redis事务操作的三个基本命令 3,解决Redis中的事务冲突(乐观锁和悲观锁) 3.1,悲观锁 3.2,乐观锁 3.3,Redis中使用乐观 ...

  8. Redis事务和锁机制

    Redis事务和锁机制 1.Redis中的事务 1.1 什么是事务 1.2 特征 1.3 事务执行的3个阶段 1.4 事物的命令 1.5 事务内部的错误处理 1.6 Redis事物的原子性 1.7 R ...

  9. Redis 事务与锁 机制

    本笔记基于bilibili尚硅谷Redis学习视频整理而来 Redis 事务与锁 机制 Redis的事务定义 Redis主要使用MULTI, EXEC, DISCARD 和 WATCH 命令来实现事务 ...

最新文章

  1. Windows系统下MySQL安装详细教程(解决MySQL服务无法启动)
  2. scrapy-redis的关键配置
  3. 编程之美2.1 求二进制中1的个数
  4. 【helpdesk】启明星helpdesk7.0版本里,实现邮件提交功能介绍和原理
  5. 【NOI2011】兔兔与蛋蛋的游戏【二分图博弈】
  6. Web 开发常备工具
  7. 18. Django进阶:中间件
  8. docker java镜像_Docker容器引擎与架构
  9. python开发100个小程序_Python小程序100例
  10. C# 回调函数的实现和应用场景
  11. 六自由度机器人设计过程-范例
  12. 考研没过线也能录取?13种特殊录取方式!
  13. NAT类型与P2P游戏
  14. c语言 exec sql编程,C语言采用嵌入式方式操作数据库exec_sql.doc
  15. RSA之 两组e与φ(n)不互素解法
  16. linux中的execl函数使用
  17. 访问者模式(Visitor模式)详解
  18. 3.12 编写程序从键盘输入一个整数,计算并输出该数的数字之和。例如:请输入 一个整数:8899123 各位数字之和为:40
  19. 初入Java测试员之路
  20. NVIDIA Jetson TX1(2)

热门文章

  1. Topk 问题详解及代码和数据分析
  2. Zookeeper 客户端源码吐血总结
  3. 计算机网络实验(华为eNSP模拟器)——第六章 密码模式和AAA模式
  4. php 根据坐标计算范围内,php计算经纬度是否在区域内
  5. 已知坐标求方位角_由方位角高度角求赤经赤纬
  6. 操作篇 HYbrid的应用和学习
  7. python笔记之if语句及嵌套浅析
  8. 54款开源服务器软件(内容管理、数据库、电子商务、邮件服务器、文件传输、操作系统、安全、小公司服务 .
  9. matplotlib 中文_详解Matplotlib中文字符显示问题
  10. deepin终端编译c程序_Deepin Linux安装使用Visual Studio Code(VSCode)调试C++