mysql并非所有引擎都支持事务处理管理。最常用的两种引擎MyISAM 和InnoDB 前者不支持明确的事务处理管理,而后者支持。
事务(Transaction)是一组SQL语句集合,一个最小的不可再分的工作单元。事务处理可以用来维持数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。通常一个事务对应一个完整的业务。
事务处理是一种机制,用来管理必须成批执行的Mysql操作,以保证数据库不包含不完整的操作结果。利用事务处理,如果没有错误发生,整租语句提交数据库表;如果发生错误,则进行回退以恢复数据库到某个已知且安全的状态。
比如向系统中添加订单的过程(表于表之间存在关联):
1)检查数据库中是否存在相应的客户,如果不存在,添加它
2)提交客户信息 customers表
3)检索客户ID customers表
4)添加一行到orders表
5)如果在添加行到orders表时出现故障,回退
6)检索orders表中赋予的新订单ID
7)对于订购的每项物品,添加新行到order items表
8)如果在添加新行到order items时出现故障,回退所有添加的order items行和order行
9)提交订单信息
回退(rollback)指撤销指定的SQL语句的过程
提交(commit)指将未存储的SQL语句结果写入数据库表
保留点(savepoint)指事务处理中设置的临时占位符(place-holder),可以对它发布回退,与回退整个事务处理不同
事务的四大特征(ACID)
原子性Atomicity:事务是最小单位,不可再分,事务包含的操作要么全执行,要么全不执行
一致性Consistency:一致性是指事务必须使数据库从一个一致的状态变到另外一个一致的状态(从一个正常状态转变到另一个正常状态)。一致性关注数据的可见性,中间状态的数据对外部不可见,只有最初状态和最终状态的数据对外可见。比如A向B转账,其他事务只能看到转账前的状态和转账成功后的状态,中间状态是不可见的
隔离性Isolation:一个事务的执行不能被其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性Durability:也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
事务的四个隔离级别
未提交读(Read-uncommitted):在该隔离级别,所有事物都可以看到其他未提交事务的执行结果。容易导致脏读
已提交读(Read-committed):一个事物在提交之前对其他事物是不可见的,避免脏读,允许不可重复读和幻读。因为在一个事务任意时刻读到的数据可能不一样,可能会受到其它事务对数据修改提交后的影响
可重复读(Repeatable-Read):MySQL默认的隔离级别。避免脏读,不可重复读,允许幻读。Innodb和Falcon存储引擎通过多版本并发控制(MVCC)机制解决了幻读问题
串行化(Serializable):这是最高的隔离级别。串行化读,事务只能一个一个执行,避免了脏读、不可重复读、幻读。它是在每个读的数据行上加共享锁,在这个级别,可能导致大量的超时现象和锁竞争,执行效率慢,使用时慎重
1)脏读:一个事务A对数据进行了增删改查,但是未提交事务。另一个事务B可以读取到未提交的数据,如果事务A进行了回滚,那么事务B就读到了脏数据
2)不可重复读:一个事务的两次查询数据不一致,一般是对于update操作。比如在事务A第一次读取后,事务B对数据做了修改,事务A二次读取就会受影响
3)幻读:一个事务的两次查询数据不一致,一般针对Insert操作。例如有一个事务查询了几列数据,而另一个事务却在此时插入了新的数据,先前的事务在接下来的查询中,就会发现有几列数据是他先前所没有的。
网友评论