十、MySQL事务
一、事务的四大特性(ACID)
-
原子性(Atomicity):所有操作是不可再分割的原子单位。
-
一致性(Consistency):业务规则保持一致。
-
隔离性(Isolation):并发操作中,不同事务之间应该隔离开来,
-
持久性(Durability):事务中所有的数据操作都必须被持久化到数据库中。
下面演示zhangsan给lisi转账1000元的示例:
-- 建表 CREATE TABLE account( id BIGINT PRIMARY KEY, balance BIGINT COMMENT '余额' )ENGINE='InnoDB',CHARSET='utf8' -- 插入数据 INSERT INTO `account` (`id`,`balance`) VALUES ('1','10'),('2','10');
-- 放弃事务,转账失败: START TRANSACTION; UPDATE account SET balance=balance-10 WHERE id=1; UPDATE account SET balance=balance+10 WHERE id=2; ROLLBACK; -- 提交事务,转账成功: START TRANSACTION; UPDATE account SET balance=balance-10 WHERE id=1; UPDATE account SET balance=balance+10 WHERE id=2; COMMIT;
--回到回滚点rol_01,此次是只执行第一条update语句 START TRANSACTION; UPDATE account SET balance=balance-1000 WHERE id=1; SAVEPOINT rol_01; UPDATE account SET balance=balance+1000 WHERE id=2; ROLLBACK TO SAVEPOINT rol_01; COMMIT
-
-
不可重复读(虚读):在一个事务内,多次读同一个数据
大致的区别在于不可重复读是由于另一个事务对数据的更改所造成的,而幻读是由于另一个事务插入或删除引起的。不可重复读需要锁住满足条件的记录,幻读要锁住满足条件及其相近的记录
3.3、如何解决并发问题
通过设置隔离级别来解决并发问题。
3.4、事务隔离级别
-
-
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。 -
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。 -
Serializable(可串行化)