mysql的事务和隔离级别详解

Mysql中的事务

事务是DBMS中的执行单位,它是有限的数据库操作序列组成的。但是并不是所有的数据库操作序列都能成为事务。一般说来,事务具有如下4个特性(ACID特性):

1、原子性(Automicity):该特性引起的数据库操作"要么全部执行,要么全部不执行"。

2、一致性(Consistency):该特性表示数据库操作之前和操作之后的最终状态是一致的。比如,两个用户a,b之间相互转账,但是最终两个用户的总金额是不变的。

3、隔离性(Isolation):多个事务并发执行时,各个事务独立执行,且各个事务之间的影响最小。

4、持久性(Durability):一旦事务提交执行成功,则系统保证在任何故障下,事务都不会引起不一致性。

mysql中的脏读、不可重复读和幻读的概念

脏读:在Read-Uncommitted隔离级别下的当前事务中可以读到其他事务还没有提交的数据 。

不可重复读(non-repeatable reads):在当前事务中,且未提交,且其他事务在修改相关数据时,两次查询的结果不一样,就叫做不可重复读。

幻读:就是当前同一个事务在未提交和提交后的结果不一样。感觉像幻像一样。

mysql中隔离级别分为4种:

1、Read-Uncommited:读未提交。该隔离级别下的当前事务可以看到其他未提交事务的执行结果。在该级别下会出现脏读现象。

2、Read-Committed:读提交。解决了脏读的问题。在该隔离级别下,当前事务只能看到其他事务提交后的执行结果。因此该隔离级别支持不可重复读。大多数数据库的的默认隔离级别为Read-Committed,但是mysql不是的。

3、Repeatable-Read:重复读。解决了不可重复读的问题。在该级别且当前事务没有提交的前提下,不管其他事务如何修改数据,每次查询的结果都是一样的。一旦当前事务提交,则查询的结果就是最新的结果。因此会出现幻读的现象。事务提交前和提交后的结果不一样。在该级别下,为了提高并发能力,需要借助MVCC(多版本并发控制)机制来完成。这是mysql的默认隔离级别。

4、Serializable:可串行化。就是事务接着一个一个的串行执行,只有同一个实例下的其他事务结束后,才可以执行同一个实例下的另一个事务。这样就解决了幻读的问题。

总结:mysql的四种默认隔离级别所出现的读取方式:

1、Read-Uncommitted:会出现脏读、不可重复读等现象。

2、Read-Committed:会出现不可重复现象。

3、Repeatable-Read:会出现幻读现象。

4、Serializable:不会出现脏读、不可重复读、幻读等现象。

由此可见,隔离级别越高,所受到的干扰越小,消耗系统的资源越多。且最重要的是它们的并发性能越差。

mysql处理事务由2种方法:

1、手动执行事务

mysql>begin; 或mysql>start  transaction;   ##表示启动事务

mysql>rollback;                                           ##撤销之前所做的修改(回滚)

mysql>commit;                                               ##提交事务

2、设置事务的自动提交模式

mysql>select @@autocommit;     ##查看当前事务是否是自动提交的。0或off表示关闭自动提交;1或on表示开启自动提交

set  autocommit=0    ##关闭自动提交功能(只能用于当前会话,这是修改的会话变量)

set  autocommit=1    ##开启自动提交功能(只能用于当前会话,这是修改的会话变量)

mysql中隔离级别的设定:

mysql>select @@tx_isolation;        ##显示当前的隔离级别

mysql>set  tx_isolation=‘VALUE‘   ##用来设定隔离级别

事务的执行状态:共有5种状态

1、active:表示当前事务正在进行当中

2、部分提交的:表示语句在执行过程中,由于某种原因(如宕机)导致只执行了一部分。因此事务就处于该状态下。

3、失败:表示事务没有执行成功。

4、终止:由于事务执行失败,因此系统会终止该事务

5、提交成功:表示提交后,事务执行成功。

时间: 2024-12-28 21:33:53

mysql的事务和隔离级别详解的相关文章

数据库事务的四大特性以及事务的隔离级别详解

作者 : fjdingsd 来源 : 博客园 本篇讲诉数据库中事务的四大特性(ACID),并且将会详细地说明事务的隔离级别. 如果一个数据库声称支持事务的操作,那么该数据库必须要具备以下四个特性: ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性

MySQL之DDL、DML、读锁,写锁、显示锁、事务、隔离级别详解

mysql> help insert; DDL: DATABASE TABLE VIEW DML: SELECT INSERT/REPLACE UPDATE DELETE INSERT INTO: 第一种: INSERT INTO tb_name [(col1, col2,...)] {VALUES|VALUE} (val1, val2,...)[,(val21,val22,...),...] 第二种: INSERT INTO tb_name SET col1=val1, col2=val2,

SQL Server 事务隔离级别详解

原文:SQL Server 事务隔离级别详解 标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设计数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一定的影响作用. 步骤 事务隔离级别通过影响读操作来间接地影响写操作:可以在回话级别上设置事务隔离级别也可以在查询(表级别)级别上设置事务隔离级别.事务隔离级别总共有6个隔离级别:READ UNCOMMITTED(未提交读,读脏),相当于(NOLOCK)R

MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解. 2.数据库事务的隔离级别只是了解,并没有深刻理解,也没有在实际工作中体验使用过. 3.经常面试被人问起数据库加锁情况,一头雾水,很懵. 4.在网上找过很多博客,有的写得太多没耐心看,有的写得摘抄的定义,泛泛而谈,没有实操更没有讲解. 1.2 关于这篇分享对以上问题的解决 1.实践出真知,如果认真

MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)

本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理解.这篇记录我对 MySQL 事务隔离级别 read committed & MVCC 的理解. 前言 可以很负责人的跟大家说,MySQL 中的此隔离级别不单单是通过加锁实现的,实际上还有repeatable read 隔离级别,其实这两个隔离级别效果的实现还需要一个辅助,这个辅助就是MVCC-多版

MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销.Read Uncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read).Read Committed(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).

数据库四种事务隔离级别详解

四种数据库隔离级别如下所示: 1.READ-UNCOMMITTED(读取未提交内容) 由于在该隔离级别下即使事务未提交所做的修改也会对其他事务产生影响.所以该级别会出现数据脏读的发生.脏读:一个事务读取了另一个未提交的并行事务写的数据. 举例:老板给员工发工资,老板开启事务,然后想员工的账户转钱10000元.此时员工开启事务,查看账户余额发现多了10000元,然后提交事务.但是老板发现转多了,于是修改为转5000元,然后提交事务.最终员工账户多5000元而不是10000元,所以之前员工看到的10

spring事务的传播行为与隔离级别详解

关于Spring的事务有7个传播行为,4个隔离级别. 一.事务的传播行为 @Transactional(readOnly = false, rollbackFor = Exception.class) @Transactional(readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED,timeout=30) 1.propagation_required:若当前没有事务就新建一个事务,

Mysql数据库事务及隔离级别学习测试

参考了这篇文章的一些内容: http://xm-king.iteye.com/blog/770721 我在springdemo库里面建了一个表: CREATE TABLE `tx` ( `id` bigint(11) NOT NULL auto_increment, `num` bigint(11) default 0 COMMENT '用户名', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 CO