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的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
-- 创建表
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; -- 恢复默认自动提交