MySQL的事务

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了   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值