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