MySQL的事务

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了  

你可能感兴趣的:(MySQL的事务)