什么是事务
事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
事务和锁
当执行事务操作时(dml语句),mysql会在被作用的表上加锁,防止其它用户改表表的结构.这里对我们用户来讲是非常重要的。
提交事务
当执使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务子后,其它会话将可以查看到事务变化后的新数据
回退事务
在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用.保存点是事务中的一点.用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点.
当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明
mysql 数据库控制台事务的几个重要操作
start transaction; //开始一个事务 (相当于set autocommit=0关闭自动提交。不同:如果事务结束了,成或败,都会将自动提交机制,回到start状态(初始状态)。
savepoint 保存点名 ;//设置保存点
rollback to 保存点名; //取消部分事务
rollback; //失败:取消全部事务
commit; // 成功: 提交事务.
提交或回滚。
在此基础上,执行完所有的sql语句。
判断是否都成功(出现错误,包括语法错误,和逻辑错误服务器错误)。
成:将结果提交,利用 commit
败:回到开始位置。Rollback
事务的特性(ACID):
以银行汇款为例,张三给李四转款300元.
1、原子性(Atomicity)
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
即:张三减300, 李四+300 , insert银行流水, 这3个操作,必须都完成,或都不产生效果.
2、一致性(Consistency)
事务前后数据的完整性必须保持一致。
如:
(汇款前)张三的余额+李四的余额
(汇款后) 张三的余额+李四余额
比如: 张三只有280元, 280-300=-20,储蓄卡不是信用卡,不能为负,因此张三余0元.
将导致, 汇款后,2者余额,汇款前,差了20元.
3、隔离性(Isolation)
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
4、持久性(Durability)
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
事务的实现:
要求是事务支持的表类型
执行一组相关的操作前开启事务
整组操作完成后,都成功,则提交,如果存在失败,选择回滚,则会回到事务开始的备份点。
隔离级别
查看隔离级别
mysql> show variables like '%isolation%';
设置事务的级别:
mysql> set session transaction isolation level read uncommitted;
set session transaction isolation level
[read uncommitted | read committed | repeatable read |serializable]
- read uncommitted(未提交读): 事务的修改,即时没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,称为
”脏读(Dirty Read)”
。 在实际应用中一般很少用(不符原子性、对并发控制低)。 - read commited(提交读): 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别有时候也叫做不可重复读(Non-Repeatable Reads),因为两次执行同样的查询,可能会得到不一样的结果。
- repeatable read(可重复读): repeatable read解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但理论上,无法解决幻读(Phantom Reads)的问题。所谓幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取改范围的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题。(可重复读是mysql的默认事务隔离级别)
- serializeable (可串行化):它通过强制事务串行,避免了幻读问题。简单来说,serializeable 会在读取的每一行数据上加锁,所以肯导致大量的超时和锁争用的问题。这样隔离级别最高,但事务相互等待的等待长。在实用中,也不是很多。
隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
read uncommitted | yes | yes | yes | no |
read commited | no | yes | yes | no |
repeatable read | no | no | yes | no |
serializeable | no | no | no | yes |