zoukankan      html  css  js  c++  java
  • “钱“谈MySQL的事务

    事务处理语言TPL(Transaction Process Language)

    1、事务?什么叫事务?

    事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。

    可能这样解释还不是能够很好的理解事务,接下来看一个生活中的例子:

    2、与"钱"有关的事务
    我们经常做的就是转账 -_-
    
    思考一下转账包括那几个核心的步骤 ?
    1、转账账户扣钱
    2、收账方账户加钱
    
    MySQL模拟如下:
    	A 账户减掉1000update account set money = money -1000 where name = 'A';
    
    	B账户加钱 1000update account set money = money + 1000 where name = 'B';
    
    假设在A账户减钱后,程序出现了异常,那B账户还会执行加钱操作吗?
    	如果B不执行,那么A账户减钱,这样就会导致用户财产损失;
    	如果A并没有执行成功,而B执行成功了?A的钱并没有减少,而B平白增加了钱,则银行不干了。
    
    这个过程分成两步,每一个也都是一个事务,
    但是对于转账这一个单独的事务来说,是由两个更小的事务构成的,
    两个事务的执行成功,才会导致它的执行成功
    
    3、再次理解事务的概念
    • 事务是一个原子操作,是一个最小执行单元,由一个或多个SQL语句组成。
    • 同一个事务中,所有的SQL语句都执行成功时,整个事务才会成功
    • 有一个SQL语句执行失败,整个事务都执行失败。
    • 每条SQL语句都是一个独立的操作,一个操作对数据库是永久的影响。
    4、事务的原理:
    数据库会为每一个客户端都维护一个空间独立的缓冲区(回滚段)。
    
    一个事务中所有的增删改语句的执行结果都会缓存在回滚段中。
    
    当事务中所有的SQL语句均正常结束(commit),才会将回滚段中的数据同步到数据库。
    
    否则无论因为那种原因失败,整个事务将回滚(rollback)。
    
    [
    (缓冲区)可以简单理解为打游戏实时记录的蓝本存档,
    (回滚)比如打到某个关卡突然过不去,需要回到某个时间存档点,
    (提交)通关之后,游戏就结束了。
    ]
    
    5、事务的边界
    1、开始
    	隐式开启:
    		连接到数据库,执行一条DML语句,上一条事务结束后,又输入了一条DML语句,即事务的开始。
    		默认:每条语句都是一个事务,不需要手动开启,结束也不需要手动提交。
    
    	显示开启:
    		若要想多条语句共同构成一个事务
    		我们需要自己开启一个事务:Start transaction;显示开启事务,执行结束得手动提交。
    
    2、结束
    	隐式提交:一条DML语句执行完,正常提交(客户端退出连接)
    
    	显示提交:COMMIT;
    
    3、回滚:
    	隐式回滚:
    		非正常退出(断电、宕机);
    		执行了创建、删除的语句,但是失败了,会为这个无效的语句执行回滚。
    	
    	显示回滚:ROLLBACK
    6、事务的特性
    
    1、Atomicity(原子性)
    	表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
    
    2、Consistency(一致性)
    	表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前的状态。
    
    3Isolation(隔离性)
    	事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态;
    	要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。
    
    4、Durability(持久性)
    	持久性事务完成之后,它对于系统的影响是永久性的。
    
    7、事务的应用

    基于增删改语句的操作结果,可通过程序逻辑手动控制事务提交或回滚

    应用事务完成转账:
    	1、开启事务:
    		方式一:Start Transaction;
    		方式二:setautocommit=0#禁止自动提交 setautocommit=1;#开启自动提交
    
    	2、事务内数据操作语句
    	3、结束
    		事务内语句都执行成功:提交:Commit
    		事务内如果出现错误,回滚:Rollback

    rollback回滚出现错误时,才回滚,才会执行,没有,则直接Commit

  • 相关阅读:
    常用/常见Java Web 服务器/应用服务器Logo图文介绍
    三个快速且简单的让你的大脑安静下来的方法
    怎样判断自己是否在程序员平庸者之列?
    “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点)
    旁观者效应”是如何毁掉我们的代码的
    怎么理解面向对象和面向过程到底的本质区别?
    面向对象方法论与结构化方法论的本质区别【转】
    不懂技术的人不要对懂技术的人说这很容易实现
    最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告
    计算机专业的学生必须掌握的五门课程 不能掌握他们就不应该获得学位
  • 原文地址:https://www.cnblogs.com/HW-CJY/p/13751681.html
Copyright © 2011-2022 走看看