共计 1317 个字符,预计需要花费 4 分钟才能阅读完成。
- 什么是数据库事务?
数据库事务 (Database Transaction),是指作为单个逻辑工作单元执行的一系列操作,要么齐全地执行,要么齐全地不执行。
简略的说:事务就是将一堆的 SQL 语句 (通常是增删改操作) 绑定在一起执行,要么都执行胜利,要么都执行失败,即都执行胜利才算胜利,否则就会复原到这堆 SQL 执行之前的状态。
上面以银行转账为例,A 转 100 块到 B 的账户,这至多须要两条 SQL 语句:
给 A 的账户减去 100 元;update 账户表 set money=money-100 where name='A';
给 B 的账户加上 100 元。update 账户表 set money=money+100 where name='B';
如果在第一条 SQL 语句执行胜利后,在执行第二条 SQL 语句之前,程序被中断了(可能是抛出了某个异样,也可能是其余什么起因),那么 B 的账户没有加上 100 元,而 A 却减去了 100 元,在现实生活中这必定是不容许的。
如果在转账过程中退出事务,则整个转账过程中执行的所有 SQL 语句会在一个事务中,而事务中的所有操作,要么全都胜利,要么全都失败,不可能存在胜利一半的状况。
也就是说给 A 的账户减去 100 元如果胜利了,那么给 B 的账户加上 100 元的操作也必须是胜利的;否则,给 A 减去 100 元以及给 B 加上 100 元都是失败的。
2. 事务的四大个性
事务的四大个性 (ACID) 是:
(1)原子性(Atomicity):事务中所有操作是不可再宰割的原子单位。事务中所有操作要么全副执行胜利,要么全副执行失败。
(2)一致性(Consistency):事务执行后,数据库状态与其它业务规定保持一致。如转账业务,无论事务执行胜利与否,参加转账的两个账号金额之和应该是不变的。A: 1000 元 1000-100=900 1000
B: 1000 元 1000+100=1100 1000
(3)隔离性(Isolation):隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会互相烦扰。也就是说,在事中务查看数据更新时,数据所处的状态要么是另一事务批改它之前的状态,要么是另一事务批改它之后的状态,事务不会查看到中间状态的数据。例如:在 A 事务中,查看另一 B 事务 (正在批改 A 的账户金额) 中 A 的账户金额,要查看到 B 事务之前的 A 的账户金额,要么查看到 B 事务之后 A 的账户金额。
事务 1: 查问 A、B 的账户金额之和 (1000+1000)
事务 2: A 转账给 B 100 元
`A - 100 = 900`
`B + 100 = 1100`
在数据库的事务隔离级别足够高的状况下,事务和事务之间是齐全隔离的。
在事务的隔离级别较低的状况下,可能会呈现,在一个事务中可能看到另外一个事务正在进行中的数据的状态。
(4)持久性(Durability):一旦事务提交胜利,事务中所有的数据操作都必须被长久化到数据库中,即便提交事务后,数据库马上解体,在数据库重启时,也必须能保障通过某种机制复原数据。开启事务:-----
A: 1000 - 100 = 900 在日志中记录,事务提交后,将会更新 A 账户的金额为 900
B: 1000 + 100 = 1100 在日志中记录,事务提交后,将会更新 B 账户的金额为 1100
查问 A、B 账户的金额
完结事务:----- 回滚、提交