zoukankan      html  css  js  c++  java
  • MySQL 事物

    事务是数据库处理操作,其中执行就好像它是一个单一的一组有序的工作单元。换言之,事务将永远不会是完全的,除非在组内每个单独的操作是成功的。如果事务中的任何操作失败,整个事务将失败。

    实际上,许多SQL查询组成到一个组,将执行所有这些一起作为事务的一部分。

    1.概念

    一条或者多条sql语句的集合!
     事务:就是一堆操作的集合,他们同生共死。要么都执行成功,要么都执行失败
    2.事务的特性  ACID
      A:原子性  完整的,不可分割的

      原子性 (Atomicity):在事务中的操作,要么都执行,要么都不执行!


      C: 一致性  事务执行完毕后,数据的状态是一致的()

      一致性(Consistency):事务必须保证数据库从一个一致性的状态变成另一个一致性的状态!


      I: ISOLation 隔离性  两个事务执行互不影响

      隔离性(Isolation):每个事务之间互不干扰!哪怕是并发执行也不干扰!


      D: 永久性  事务执行完后,对数据的影响是永久的。

      持久性(Durability):事务一旦被改变,那么对数据库中数据的影响是永久性的!

    3.事务操作的关键字
      自动提交事务开关set autocommit=0
      开始事务 start transaction /begin
      提交事务 commit
      回滚事务 rollback
      set autocommit=1
    4.事务+++存储过程 转账的例子
      

    DELIMITER $$
    CREATE PROCEDURE usp_transfer() 
        BEGIN  
        ##错误总数默认是0
        DECLARE t_error INTEGER DEFAULT 0;  
        ## continue 继续  hanlder 执行   并且对 t_error重新赋值为1
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;  
        SET autocommit=0;
            START TRANSACTION;  
            UPDATE bank SET balance=balance-100 WHERE cid=1;    
            UPDATE bank SET balance =balance+100 WHERE cid=2;
            IF t_error > 0 THEN  
                ROLLBACK;  
            ELSE  
                COMMIT;  
            END IF;  
         SET autocommit=1; 
        END$$  
    DELIMITER ;  
     
    CALL test_sp800()
     

    定义一个存储过程的最简易的语法是

    delimiter $$
    create procedure usp_stulist()
    begin
      select * from student
    end$$
    delimiter;

     存储过程详解将在:http://www.cnblogs.com/lsy131479/p/8463804.html   中详细介绍


              模拟 银行转账!                          

    --   创建数据库

    CREATE DATABASE  myBank;

    --  切换指定的数据库

    USE myBank;

    --  创建表

    CREATE  TABLE  IF NOT  EXISTS bank(
    customerName  VARCHAR(10) NOT NULL  COMMENT '用户名',
    currentMoney  DECIMAL(10,2) NOT NULL  COMMENT '账户余额'
    );

    -- 插入数据

    INSERT INTO bank  VALUES('小黑',50000),('小白',500000);

    --  小黑  给小白  转账10000
    --   修改两条数据
    --    01.小黑-10000
    --    02.小白+10000

    UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     --  故意写错字段名称  让02  报错
    UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';
     

    --  开启事务   START TRANSACTION 或者 BEGIN
    --  01.02  为一个事务

    BEGIN
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoneysss=currentMoney+10000
     WHERE customerName='小白';


    --  事务回滚  ROLLBACK
    --  提交事务 COMMIT

    UPDATE bank SET currentMoney=500000
     WHERE customerName='小黑';
    --  证明mysql是默认提交事务的!

    SET  autocommit=0(关闭事务自动提交) | 1(开启事务自动提交)

    -- 关闭事务自动提交 

    SET  autocommit=0;
    BEGIN;   --  开启事务
     UPDATE bank SET currentMoney=currentMoney-10000
     WHERE customerName='小黑';
     UPDATE bank SET currentMoney=currentMoney+10000
     WHERE customerName='小白';
    COMMIT--  手动提交事务
      UPDATE  bank SET currentMoney=10000;
    ROLLBACK;   -- 事务回滚
    SET  autocommit=1-- 恢复自动提交
     
  • 相关阅读:
    codeforce666A_dp
    杭电1789_贪心
    杭电2059_记忆化搜索
    杭电1503_输出最长公共子序列
    杭电1501_dfs和记忆化搜索
    杭电1081_二维dp
    杭电1078_dfs
    coderforce 675C(贪心)
    杭电2571_01背包
    杭电1069_01背包
  • 原文地址:https://www.cnblogs.com/lsy131479/p/8463682.html
Copyright © 2011-2022 走看看