欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mysql学习笔记:事务

程序员文章站 2022-07-04 23:40:55
...

例:有一个account表,小白和小黑余额都是1000.
mysql学习笔记:事务
小黑要从小白处借500,代码实现如下:

UPDATE account SET balance = balance - 500 WHERE name = '小白';
UPDATE account SET balance = balance + 500 WHERE name = '小黑';

可是由于某些原因,第二行语句没有执行。显示结果如下:
mysql学习笔记:事务
小白的500元不见了。再小黑的钱也没有增加,这显然不合适。对于这种情况就要用到我们今天学的事务。

  • 事务
    描述:一个包含多个步骤的业务操作,要么全部成功,要么全部失败。
    • 开启事务 START TRANSACTION
      例:
      START TRANSACTION;
      UPDATE account SET balance = balance - 500 WHERE name = '小白';
      UPDATE account SET balance = balance + 500 WHERE name = '小黑';
      
    • 回滚 ROLLBACK
      当出现错误时,将数据还原成开始事务时的值。
      START TRANSACTION;
      UPDATE account SET balance = balance - 500 WHERE name = '小白';
      UPDATE account SET balance = balance + 500 WHERE name = '小黑';
      ROLLBACK;
      
    • 提交 COMMIT
      mysql中事件默认自动提交,可是开启事务后需要手动提交
      START TRANSACTION;
      UPDATE account SET balance = balance - 500 WHERE name = '小白';
      UPDATE account SET balance = balance + 500 WHERE name = '小黑';
      COMMIT;
      
      如果没有提交只是进行临时修改,数据库中的值不会变化。只有提交后才会真正修改。
  • 设置事务自动提交
    • 查询提交状态
      SHOW VARIABLES LIKE 'autocommit';	-- 方式一
      SELECT @@autocommit;				-- 方式二
      
    • 设置提交状态
      SET autocommit = ON;	--	方式一	'ON'表示:自动, 'OFF'表示:手动
      SET @@autocommit = 1;	-- 方式二	'1'表示:自动, '0'表示:手动
      
  • 事务的四大特性
    • 原子性:不可分割,要么同时成功,要么同时失败
    • 持久性:事务提交或回滚后,数据永久有效
    • 隔离性:多个事务之间,相互独立
    • 一致性 :事务操作前后,数据总量不变
  • 事务隔离级别
    mysql学习笔记:事务
    • 注意:隔离级别越来越高,效率最来越低

      • read uncommit 读未提交
        产生:脏读、不可重复读、幻读
      • read commit 读已提交(oracle默认)
        产生:不可重复读、幻读
      • repeatable read 可重复读 (mysql默认)
        产生:幻读
      • serializable 串行化
    • 设置隔离级别

      • 查询隔离级别
        SELECT @@tx_isolation;
        
      • 设置隔离级别
        SET global TRANSACTION ISOLATION LEVEL Serializable;
        
        参数可以为:Read uncommitted、Read committed、Repeatable read、Serializable
相关标签: 笔记