您现在的位置是:首页 >技术杂谈 >数据库的事务网站首页技术杂谈
数据库的事务
数据库的事务
1、事务是什么
TRANSACTION(事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
2、事务可以做什么
数据库事务通常包含了一个序列的对数据库的读/写操作。包含有以下两个目的:
2.1、为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2.2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
当事务被提交给了数据库管理系统(DBMS),则 DBMS 需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要回滚,回到事务执行前的状态;同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
3、如何运用事务
同事务一起提到的ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。
3.1、A,也就是原子性:
事务中的每一个操作要么全部执行,要么全部不执行。
3.2、 C,也就是一致性:
事务执行无论成功还是失败,执行前与执行后,数据库的状态应该是一致的。例如一个事务要修改数据库中的一项数据,那么这项数据修改前后都应该是正确的。
3.3、 I,也就是隔离性:
多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些问题,就有了“隔离级别”的概念。要知道,你隔离得越严实,效率就会越低。因此很多时候,需要在二者之间寻找一个平衡点。SQL 标准的事务隔离级别包括:读未提交(read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(serializable )。
3.3.1、读未提交
一个事务还没提交时,它做的变更就能被别的事务看到。
3.3.2、读提交
一个事务提交之后,它做的变更才会被其他事务看到。
3.3.3、可重复读
一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
3.3.4、串行化
顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
3.3.5、解决的问题
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 | 可能 | 可能 | 可能 |
读已提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
3.4、D,也就是持久性
一旦事务提交,其结果就永久保存在数据库中了。