- 什么是数据库事务?
数据库事务(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账户的金额
完结事务:-----回滚、提交