MySQL事务(transaction)看这篇就足够了
单节狂砍30分的胡亦 人气:0MySQL事务处理(TransAction)
思考了很久,决定写一篇关于mysql事务(transaction)的博客,一来嘛,因为最近在复习mysql的相关知识,帮自己回顾总结一下,其次就是想把这篇博客分享给大家,如果你才刚刚开始学习mysql,那么希望这篇博客对你有一点启发;亦或者你早已是一个mysql老油条,这篇博客也会使你对mysql事务有一个更深的印象。
首先,什么是事务呢?
事务就是由单独单元的一个或多个sql语句组成,在这个单元中,每个sql语句都是相互依赖的。而整个单独单元是作为一个不可分割的整体存在,类似于物理当中的原子(一种不可分割的最小单位)。
往通俗的讲就是,事务就是一个整体,里面的内容要么都执行成功,要么都不成功。不可能存在部分执行成功而部分执行不成功的情况。
就是说如果单元中某条sql语句一旦执行失败或者产生错误,那么整个单元将会回滚(返回最初状态)。所有受到影响的数据将返回到事务开始之前的状态,但是如果单元中的所有sql语句都执行成功的话,那么该事务也就被顺利执行。
大家都知道,我们的数据都是通过各种不同技术的存储引擎来引导存储的,不同的存储引擎,都有各自的特点。在mysql中,常见的存储引擎有innodb、myisam,memory等。其中innodb支持事务(transaction),而myisam,memory等不支持事务。
可以通过
show engines;
语句来查看mysql支持的存储引擎
一、事务的四个特性(ACID)【面试常考项】
- 原子性(Atomicity):指事务是一个不可分割的最小工作单位,事务中的操作只有都发生和都不发生两种情况
- 一致性(Consistency):事务必须使数据库从一个一致状态变换到另外一个一致状态,举一个栗子,李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
- 持久性(Durability):一个事务一旦提交成功,它对数据库中数据的改变将是永久性的,接下来的其他操作或故障不应对其有任何影响。
二、事务的分类
事务分为隐式事务和显式事务两种。我们的DML语句(insert、update、delete)就是隐式事务。
1.隐式事务:该事务没有明显的开启和结束标记,它们都具有自动提交事务的功能;不妨思考一下,update语句修改数据时,是不是对表中数据进行改变了,它的本质其实就相当于一个事务。
举一个栗子:张三同学买了一个csdn定制保温杯花了99元,是不是就是update语句对字段name为张三的同学的余额balance进行减99元的处理呢?代码如下:
2.显示事务:该事务具有明显的开启和结束标记;也是本文重点要讲的东西。使用显式事务的前提是你得先把自动提交事务的功能给禁用。禁用自动提交功能就是设置autocommit
变量值为0(0:禁用 1:开启)
先查看一下当前的autocommit变量值,发现当前处于开启自动提交事务的状态
禁用自动提交事务的功能并查看当前状态
三、开启事务的步骤
假设t_account表已经存在
#步骤一:开启事务(可选) start transaction; #步骤二:编写事务中的sql语句(insert、update、delete) #这里实现一下"李二给王五转账"的事务过程 update t_account set balance = 50 where vname = "李二"; update t_account set balance = 130 where vname = "王五"; #步骤三:结束事务 commit; #提交事务 # rollback; #回滚事务:就是事务不执行,回滚到事务执行前的状态
运行结果:
四、事务并发时出现的问题
但是呢,因为某一刻不可能总只有一个事务在运行,可能出现A在操作t_account表中的数据,B也同样在操作t_account表,那么就会出现并发问题,对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采用必要的隔离机制,就会发生以下各种并发问题。
加载全部内容