事务
事务是一组原子性的SQL语句,它是数据库操作的基本单元。事务内的SQL语句,要么全部执行,要么全部执行失败。
MySQL中定义一组事务
START TRANSACTION;
SELECT ...;
UPDATE ...;
INSERT INTO ...;
DELETE ...;
COMMIT | ROLLBACK;
查看事务隔离级别:SELECT @@tx_isolation;
设置事务隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [
READ UNCOMMITTED |
READ COMMITTED |
REPEATABLE READ |
SERIALIZABLE
]
事务的ACID特性
- 原子性(Atomicity):整个事务中的所有操作要么全部成功提交,要么全部失败回滚;
- 一致性(consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果事务成功提交,那么数据库的一致性状态发生转变(理解为数据发生变化),如果事务回滚,则不会修改数据库的一致性状态。
- 隔离性(isolation):事务与事务之间的可见性。MySQL中定义了四种隔离级别,不同隔离级别中,事务间的可见性不同。
- 持久性(durability):一旦事务提交,其所做的修改会永久保存在数据库中。即使数据库系统崩溃,数据也不会丢失。
隔离级别
- 未提交读(READ UNCOMMITTED)
事务中的修改,即使没有提交,其它事务也是可见的。 - 提交读(READ COMMITTED)
事务执行期间所做的修改,只要还没有提交,其它事务是不可见的; - 可重复读(REPEATABLE READ)
在同一事务中,多次读取相同记录的结果是一致的,除非数据是被本身事务所修改;MySQL默认的事务隔离级别。 - 可串行化(SERIALIZABLE)
最高的隔离级别。强制事务串行执行(一个事务执行完才执行下一个事务),SERIALIZABLE会在读取的每个数据上都加锁。
可能导致大量的超时或锁争用的问题;
不同隔离级别带来的问题
- 脏读(Dirty read)
事务1中读取到另一个事务2还未提交的数据; - 不可重复读(Unrepeatablead)
在一个事务中,查询相同记录的数据,多次查询的结果不一致; - 幻读(Phantom Read)
一个事务1读取某个范围内的记录时,另一个事务2对该范围插入新的记录,当事务1再次读取该范围的记录时,会产生换行。
不可重复读和幻读很类似。不同在于:不可重复读的重点在于修改;而幻读的重点在于新增或删除;
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
READ UNCOMMITTED | YES | YES | YES | NO |
READ COMMITTEDN | NO | YES | YES | NO |
REPEATABLE READ | NO | NO | YES | NO |
SERIALIZABLE | NO | NO | NO | YES |