加载中...

MySQL—事务(ACID)

参考CSDN:https://blog.csdn.net/dengjili/article/details/82468576

1.事务四大特性

原子性(Atomicity)
  要么都成功,要么都失败。

一致性(Consistency)
  事务前后数据的完整性必须保持一致。

持久性(Durability)

  事务一旦提交侧不可逆,被持久化到数据库中!

隔离性(Isolation)
  事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

  每个操作每个事务都要互相隔离。

    隔离所导致的一些问题

      1.脏读:

        指一个事务读取了另外一个事务未提交的数据。

      2.不可重复读:

          在一个事务内读取表中的某一行数据,多次读取结果不同。

        (这个不一定是错误,只是某些场合不对) 

      3.虚读(幻读)

        就是别人事务都已经提交了,但是你的事务里读到的还是提交前的值。
        (一般是行影响,多了一行)

MySQL---它是默认开启事务提交的!

2.事务的隔离级别  

  SQL 标准定义了四个隔离级别:

  • READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
3.模拟转账案例

 -- 创建表

CREATE TABLE account(
id INT(3) NOT NULL auto_increment,
name VARCHAR(30) NOT NULL,
money DECIMAL(9,2) NOT NULL,
PRIMARY KEY(id)
)ENGINE=INNODB DEFAULT CHARSET=utf8


INSERT INTO account(name,money) VALUES('A',2000.00),('B',1000.00)


-- 模拟转账:事务
SET autocommit = 0; -- 关闭自动提交
START TRANSACTION -- 开启一个事务(一组事务)


UPDATE account SET money=money-500 WHERE name = 'A'; -- A减500
UPDATE account SET money=money+500 WHERE name = 'B'; -- B加500


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


SET autocommit = 1; -- 恢复默认自动提交

 

posted @ 2020-02-11 19:26  luckyjcx  阅读(139)  评论(0编辑  收藏  举报