Transaction 事务
1.什么是事务?为什么要用事务?
什么是事务?
一个事务是由一条或者多条sql语句构成,这一条或者多条sql语句要么全部执行成功,要么全部执行失败!
那为什么要使用事务呢???
举例:
银行转账!张三转10000块到李四的账户,这其实需要两条SQL语句:
- 给张三的账户减去10000元;
- 给李四的账户加上10000元。
如果在第一条SQL语句执行成功后,在执行第二条SQL语句之前,程序被中断了(可能是抛出了某个异常,也可能是其他什么原因),那么李四的账户没有加上10000元,而张三却减去了10000元。这肯定是不行的!
事务中的多个操作,要么完全成功,要么完全失败!不可能存在成功一半的情况!也就是说给张三的账户减去10000元如果成功了,那么给李四的账户加上10000元的操作也必须是成功的;否则给张三减去10000元,以及给李四加上10000元都是失败的!
2.事务的特性
2.1 事务的四大特性(ACID)
1.原子性(Atomicity):
- 事务中所有操作是不可再分割的原子单位。事务中所有操作要么全部执行成功,要么全部执行失败。
2.一致性(Consistency):
- 事务执行前后,数据库状态与其它业务规则保持一致。如转账业务,无论事务执行成功与否,参与转账的两个账号余额之和应该是不变的。
3.隔离性(Isolation):
- 隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
4.持久性(Durability):
- 一旦事务提交成功,事务中所有的数据操作都必须被持久化到数据库中。即使提交事务后,数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。
2.2 数据库的并发访问问题
如果不考虑隔离性,事务存在3中并发访问问题:
1)脏读:一个事务读到了另一个事务未提交的数据
- 未提交的数据很有可能会被回滚
2)不可重复读:一个事务读到了另一个事务已经提交(update)的数据。引发这个事务,在事务中的多次查询结果不一致。
- 前后读取到的对应记录,其值不同(行级)
3)虚读 /幻读:一个事务读到了另一个事务已经提交(insert)的数据。导致这个事务,在事务中多次查询的结果不一致。
- 前后查询到的记录数不同(表级)
2.3 数据库的隔离级别:解决问题
数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况:
1.read uncommitted 读未提交:一个事务读到另一个事务没有提交的数据。
- a)存在:3个问题(脏读、不可重复读、虚读)
- b)解决:0个问题
2.read committed 读已提交:一个事务读到另一个事务已经提交的数据。
- a)存在:2个问题(不可重复读、虚读)。
- b)解决:1个问题(脏读)
3.repeatable read可重复读:在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
- a)存在&#x