事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
当执行事务操作时(dml语句),mysql会在被作用的表上加锁,防止其它用户改表表的结构.这里对我们用户来讲是非常重要的。
当执使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务子后,其它会话将可以查看到事务变化后的新数据
在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用.保存点是事务中的一点.用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点.
当执行rollback时,通过指定保存点可以回退到指定的点,这里我们作图说明
start transaction; //开始一个事务 (相当于set autocommit=0关闭自动提交。不同:如果事务结束了,成或败,都会将自动提交机制,回到start状态(初始状态)。
savepoint 保存点名 ;//设置保存点
rollback to 保存点名; //取消部分事务
rollback; //失败:取消全部事务
commit; // 成功: 提交事务.
在此基础上,执行完所有的sql语句。
判断是否都成功(出现错误,包括语法错误,和逻辑错误服务器错误)。
成:将结果提交,利用 commit
败:回到开始位置。Rollback
以银行汇款为例,张三给李四转款300元.
事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
即:张三减300, 李四+300 , insert银行流水, 这3个操作,必须都完成,或都不产生效果.
事务前后数据的完整性必须保持一致。
如:
(汇款前)张三的余额+李四的余额
(汇款后) 张三的余额+李四余额
比如: 张三只有280元, 280-300=-20,储蓄卡不是信用卡,不能为负,因此张三余0元.
将导致, 汇款后,2者余额,汇款前,差了20元.
多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
一个事务一旦被提交,它对数据库中的数据改变就是永久性的。
事务的实现:
要求是事务支持的表类型
执行一组相关的操作前开启事务
整组操作完成后,都成功,则提交,如果存在失败,选择回滚,则会回到事务开始的备份点。
查看隔离级别
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]
”脏读(Dirty Read)”
。 在实际应用中一般很少用(不符原子性、对并发控制低)。隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读 |
---|---|---|---|---|
read uncommitted | yes | yes | yes | no |
read commited | no | yes | yes | no |
repeatable read | no | no | yes | no |
serializeable | no | no | no | yes |