• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

数据库事务

互联网 diligentman 1周前 (10-14) 12次浏览
  1. 什么是数据库事务?

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


喜欢 (0)