事务:
事务是并发控制的单元,是用户定义的一个操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位
通过事务,SQL能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性
事务的提交和回滚:
事务通常以begin transaction开始,以commit或rollback结束
commit表示提交,即提交事务的所有操作,具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去 ,事务正常结束
rollback表示回滚,即在事务运行的过程中发生了某种故障,事务不能进行,系统将事务中对数据库的所有已完成操作全部撤销,回滚到事务开始的状态
事务的特性:
ACID
原子性(atomicity):事务是数据库的逻辑工作单位,而且必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行
一致性(consistency):事务在完成时,必须是所有的数据保持一致状态,在相关数据库中,所有规则都必须应用于事务的修改,以保持数据的完整性
隔离性(isolation):一个事务的执行不能被其他事务所影响,企业级的数据库每一秒钟都可能应付成千上万的并发访问,由数据库理论可知,由于并发访问,在不可预料的时刻可能引发几个问题
持久性(durability):一个事务一旦提交,事务的操作便永久性的保存在DB中,即使此时再执行回滚操作也不能撤销所做的更改
事务的并发问题:
更新丢失:如果两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题:最后的更新覆盖了由其他事务所做的更新
脏读:读未提交,一个事务读取到了另一个事务未提交的数据操作结果
不可重复读:一个事务对同一行数据重复读取两次,但是却得到了不同的结果。例如事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值
幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的
事务的隔离级别:
读未提交(Read uncommitted):最低级别,以上情况均无法保证
读已提交(Read committed):可避免脏读情况发生
可重复读(Repeatable read):可避免脏读、不可重复读情况的发生。不可以避免虚读
串行化(Serializable):事务只能一个一个执行,避免了脏读、不可重复读、幻读。执行效率慢,使用时慎重