zoukankan      html  css  js  c++  java
  • 12事务

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

    START TRANSACTION;#开启事务,关闭mysql自己的自动提交方式,仅限于本窗口
    
    UPDATE account SET money=money-1000 WHERE id=2;
    UPDATE account SET money=money+1000 WHERE id=1;
    
    COMMIT;    #提交当前事务
    #ROLLBACK 回滚当前事务

    原子性:对其数据的修改,要么全都执行,要么全都不执行

    一致性:原来怎样,现在还怎样

    隔离性:一个事务不能知道另一个事务的执行情况

    持久性

    只有Innodb数据库引擎的数据库或表才支持事务;

    事务控制语句

    BEGIN或START TRANSACTION; 显式地开启一个事务;

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

    SAVEPOINT sa1;
    ...
    ROLLBACK TO sa1;

    当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。

    用法是在事务中的查询语句最后面加上 FOR UPDATE。查询的时候后面的条件,如果表中有主键,那么锁定的是当前行的数据。如果没有主键,那么锁定的是整行表。

    START TRANSACTION;
    
    set @m=0;
    
    SELECT money into @m from account where id = 1 FOR UPDATE;
    
    select @m;
    
    -- 看到余额后 充值100 块
    update account set money = @m + 100 where id = 1;
    
    SELECT * from account;
    
    COMMIT;

    next

    START TRANSACTION;
    
    set @m=0;
    
    SELECT money into @m from account where id = 1 FOR UPDATE;
    
    select @m;
    
    -- 看到余额后 取款100 块
    update account set money = @m - 100 where id = 1;
    
    SELECT * from account;
    
    COMMIT;
  • 相关阅读:
    winform控件库二次开发yy
    Oracle数据库表死锁和解锁
    集合去重筛选
    linux手动生成core dump
    HandlerSocket简介以及php使用handlersocket
    使用truss、strace或ltrace诊断软件的“疑难杂症”
    Sqlserver 2012 导出表数据为SQL脚本
    MySQL的索引为什么使用B+Tree
    计算机体系
    docker使用
  • 原文地址:https://www.cnblogs.com/start20180703/p/10354435.html
Copyright © 2011-2022 走看看