事务的四大特性(ACID)
事务(Transaction)
事务是指访问和操作数据库的一组动作组成的逻辑单元。在进行数据库操作时,可设置auto commit或manual commit,如果是auto commit模式,则每条写操作作为一个独立事务单元,执行后立即commit;如果是manual commit模式,则需要手工设置事务开始(begin transaction),根据业务处理情况,执行手工commit或rollback。
- 原则性(Atomicity)
原子性是指事务包含的所有操作,要么全部成功(commit),要么全部失败(rollback),不能出现部分提交部分未提交的情况。 - 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性的状态变到另一个一致性的状态,也就是事务执行前和执行后,数据库内容都处于一致性状态。
比如A和B两个账户总共有100块钱,无论他们直接进行多少次转账操作,账户总金额始终是100块。 - 隔离线(Isolation)
隔离线是指当有多个用户并发访问数据库时,数据库为每个用户打开一个事务,事务间不能互相影响,具体的隔离效果,需要根据事务的隔离级别来确定,相关描述见下文。 - 持久性(Durability)
持久性是指一个事务一旦提交,那么事务对数据修改的效果是永久性的,不会由于数据库故障而丢失。
事务隔离级别
对于数据库的事务性操作,主要是CRUD,其中R是读操作,不会修改数据库内容,CUD是改操作,会修改数据库的内容。根据数据库隔离线级别不同,对数据库的读操作会出现如下问题。
隔离问题
- 脏读
脏读是指事务T1读取了事务T2未提交的数据,事务T2回滚后导致T1读到的数据是脏数据库。脏读的粒度是表行。
解决脏读的方法是修改隔离级别为“未读提交”以上。 - 不可重复读
不可重复读是指事务T1多次查询同一条记录,返回了不同的数据,这是由于在两次查询间隔过程中,数据库记录被事务T2修改了导致的。不可重复读的粒度是表行。
解决不可重复读的方法是锁住要修改的数据行。 - 幻读(虚读)
幻读是指事务T1读取了表中的一类数据进行操作时,在操作过程中,事务T2修改(新增、修改或删除)了批量中的某条记录,导致T1发现数据不一致。
解决幻读的方法是锁住要修改的整张表。不可重复读和幻读的主要确保是:不可重复读侧重于数据被修改,幻读侧重于数据被新增或删除。
隔离级别
- Read Uncommitted(读未提交)
一个事务开始写数据操作,则不允许其他事务同时进行写操作,但允许其他事务读取此行数据库,改隔离级别可以通过“排他写锁”实现。
改隔离级别允许一个事务读取到另一个事务未提交的数据,会导致脏读。 - Read Committed(读已提交)
读取的事务允许其他事务继续进行写操作,但未提交的写操作禁止其他事务访问。
该隔离级别避免了脏读,但是会出现不可重复读。 - Repeatable Read(可重复读)
读取的事务会禁止写事务,但是允许读事务,写事务禁止任何其他事务。
该隔离级别避免了脏读和不可重复读,但是会导致幻读。 - Serializable(序列化)
禁止任何并发事务,事务一个接一个串行化执行。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。