MySQL的事务
简述:在关系数据库中,事务可以是一条SQL语句、一组SQL语句或整个程序。注意事务和程序是两个概念,一般来讲,一个程序中包括多个事务
事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durablity)。这四个特性简称为ACID特性(ACID properties):
1.原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部执行成功,要么全部失败回滚,对于一个事务来说不可能只执行其中一部分操作,这就是事务的原子性。
2.一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态.
3.隔离性:多个事务并发执行时, 一个事务的执行不应影响其他事务的执行.
4.持久性:已被提交的事务对数据库的修改应该永久保存在数据库中.
事务的隔离级别
1.读未提交
在 READ UNCOMMITED 级别中, 事务的修改, 即使没有提交, 对其他事务也是可见的. 其他事务可以读取此事务中的未提交的数据, 这也被称为脏读(Dirty Read). 此事务隔离级别会导致很多问题, 并且性能也不会比其他事务隔离级别好多少, 因此在实际环境中很少使用.
2.读提交
大多数的数据库默认隔离级别都是 READ COMMITED, 但是 MySQL 并不是. 在 READ COMMITED 级别中, 一个事务从开始到提交之前, 所做的任何修改对其他事务都是不可见的.
这个级别有时也叫不可重复读(nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
3.可重复读
REPEATABLE READ 解决了脏读的问题. 该级别保证了在同一个事务中多次读取同样记录的结果时一致的. 但是理论上, 可重复读隔离级别还是无法解决另一个幻读(Phantom Read)的问题. 所谓幻读, 指的是当某个事务在读取某个范围内的记录时, 另外一个事务又在该范围内插入了新的记录, 当之前的事务再次读取该范围的记录时, 会产生幻行(Phantom Row).
可重复读是 MySQL 的默认事务隔离级别.
4.可串行化是最高的隔离级。它通过强制事务串行执行,避免了前面说的幻读的问题。简单来说,它会在读取的每一行数据上都加锁,所以可能导致大量的超时和锁争用的问题。实际应用中很少用到这个隔离级别,只有在非常需要确保数据的一致性而且可以接受没有并发的情况下,才考虑使用该级别。
隔离级别的总结:
实例:
事务只对innodb 引擎适用
show create table t1;
alter table t1 engine=innodb;#更改引擎
delete from 原来12条数据 delete以后 再插入数据 从 13开始
truncate 删除 原来12条数据 delete以后 再插入数据 从 1开始
rollback 回滚
mysql> insert into t1(name) values("user14"),("user24"),("user34"),("user44");
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> savepoint p3; #保持 插入后的一个状态 跟Linux的快照比较类似
Query OK, 0 rows affected (0.00 sec)
mysql> delete from t1;
Query OK, 24 rows affected (0.00 sec)
mysql> rollback to p2;
Query OK, 0 rows affected (0.00 sec)
p1 p2 p3
如果回到了 p2 那么可以再回到 p1 但是 回不到 P3了