数据库基础(二)——数据库事务
前言
所谓数据库事务指的就是,事务被看作是一个整体,如果其中一环出现执行问题,则整个事务就会回到最初始阶段。
比如,以银行转账为例:A给B转账100元,相应的A的账户中将减少一百元,然后将B的账户中增加100元。如果我们把这个过程看作是一个事务的话,那么组成这个事务最少需要三条SQL:
- 查询A账户中是否低于100元;
- 如果A账户中不低于100元,则余额减少100;
- 将B账户中增加100元。
再执行上述三条SQL语句的过程中,如果我们任何一环出现问题,都会导致所有执行过的SQL语句失效。
概述
在前言中有过描述,其实总结起来一句话:要么都成功,要么都失败。
通俗来说的话,其实就是将一组SQL放在同一个批次中去执行。事务要遵循ACID原则:
-
原子性(Atomicity):所有的SQL语句必须全部完成,要么就全部失败;
-
一致性(Consistency):分为结果一致性以及过程一致性。结果一致性表示为数据总量等相关约束在事务执行技术后不能发生变化;过程一致性在后续会有说明,
-
隔离性(Isolation):表示不同的事务以及操作不能互相影响,如果出现了隔离失败的情况很有可能会导致以下几种情况的发生
- 脏读:指一个事务在执行过程中,读取了另外一个事务没有提交的数据,导致出现数据不一致的问题;
- 不可重复读:在一个事务多次读取表中的同一条数据的时候,由于读取时间在事务提交的前后而出现读取数据不同的情况;
- 虚读:指一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
-
持久性(Durability):事务提交不可逆,只要成功提交的事务都会被持久化到数据库中。
事务使用
MySQL默认是自动提交事务的,我们需要手动更改一下,才可以自己手动定义事务。
-- 默认为1,表示自动提交事务
set autocommit = 0;
接下来可以手动处理事务
-- 首先开启事务
start transaction;
-- 然后执行SQL语句
xxx
xxx
xxx
-- 提交事务
commit;
-- 回滚事务
rollback;
-- 最后结束事务
set autocommit = 1;
-- 最后补充一句,这些代码是一条一条执行的,不要全选并执行
-- 其次,本段语句中的回滚(rollback)是为了个大家测试用的,不能会commit一起执行,二者选其一执行。
-- 回滚是指SQL语句执行出现问题后将该事务中所有执行的SQL语句操作的数据全部回到初始阶段。
-- 如果大家非要一股脑全部执行一遍的话,请假rollback去掉后在执行。这样的话在效果上与不开启事务一样,所以也没什么必要
一定要记住,我们在事务执行到最后一定要将autocommit设置为1 ,即恢复默认值,这样才可以关闭事务。
在上面提到了事务回滚,事务回滚其实就是将事务中执行的SQL语句所造成的的数据修改恢复到执行之前。
总结
事务的管理在本小节中只是说明一下,具体使用将在Java所编写的业务层中有详细的说明。