zoukankan      html  css  js  c++  java
  • MySQL数据库----事务处理

    事物处理

     一、 什么是事务

         一组sql语句批量执行,要么全部执行成功,要么全部执行失败

    二、为什么出现这种技术

      为什么要使用事务这个技术呢? 现在的很多软件都是多用户,多程序,多线程的,对同一个表可能同时有很多人在用,为保持数据的一致性,所以提出了事务的概念。这样很抽象,举个例子: 

    A 给B 要划钱,A 的账户-1000元, B 的账户就要+1000元,这两个update 语句必须作为一个整体来执行,不然A 扣钱了,B 没有加钱这种情况很难处理。

    三、事物的特性 

      80年代中国人结婚四大件:手表、自行车、缝纫机、收音机(三转一响)。要把事务娶回家同样需要四大件,所以事务很刻薄(ACID),四大件清单:原子性(Atom)、一致性(Consistent)、隔离性(Isolate)、持久性(Durable)。ACID就是数据库事务正确执行的四个特性的缩写。

    • 原子性:要么不谈,要谈就要结婚!

        对于其数据修改,要么全都执行,要么全都不执行。

    • 一致性:恋爱时,什么方式爱我;结婚后还得什么方式爱我;

        数据库原来有什么样的约束,事务执行之后还需要存在这样的约束,所有规则都必须应用于事务的修改,以保持所有数据的完整性。

    • 隔离性:闹完洞房后,是俩人的私事。

        一个事务不能知道另外一个事务的执行情况(中间状态)

    • 持久性:一旦领了结婚证,无法后悔。

        即使出现致命的系统故障也将一直保持。不要告诉我系统说commit成功了,回头电话告诉我,服务器机房断电了,我的事务涉及到的数据修改可能没有进入数据库。

    另外需要注意:

    • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
    • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
    • 事务用来管理 insert,update,delete 语句
    四、事务控制语句:
    • BEGIN 或 START TRANSACTION;显式地开启一个事务;

    • COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;

    • ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

    • SAVEPOINT : 保存点,可以把一个事物分割成几部分.在执行ROLLBACK 时 可以指定在什么位置上进行回滚操作.

    注意: SET AUTOCOMMIT=0 ;禁止自动提交 和 SET AUTOCOMMIT=1 开启自动提交.

    五、例子: 鲁班转账给后羿

    1.创建表 

    1
    2
    3
    4
    5
    create table account(
        id int(50) not null auto_increment primary key,
        name VARCHAR(50) not null,
        money DOUBLE(5,2) not NULL
    );

    2.插入数据

    1
    insert into account (name,money) values('鲁班',250),('后羿',5000);

    3.执行转账

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    start transaction-- 开启事物
     --  执行sql语句操作
     update account set money = money - 500 where id ='1';  
     update account set money = money+500 where id = '2';
     
    commit;  -- 手动提交事物
    rollback-- 回滚事物
     
    --  查看结果
    select from account;

     4.保存点使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    START TRANSACTION ;
     
    insert into account (name,money) values('李元芳',1000);
     
    SAVEPOINT s1; -- 设置保存点
     
    insert into account (name,money) values('张桂枝',1500);
     
    ROLLBACK to s1; -- 事物回滚到保存点<br>COMMIT; --提交事物
  • 相关阅读:
    java多线程编程(一基础概念)
    【转】android程序编译过程
    【转】什么是线程安全和线程不安全
    【转】计算机中时间的表示和存储
    【转】字符编码
    C/C++程序编译流程
    NDK学习笔记-JNI的异常处理与缓存策略
    NDK学习笔记-JNI数据类型和属性方法的访问
    NDK学习笔记-JNI数据类型和属性方法的访问
    NDK学习笔记-JNI开发流程
  • 原文地址:https://www.cnblogs.com/TheLand/p/8488625.html
Copyright © 2011-2022 走看看