一、事务
1.1事务概念
事务处理可以用来维护数据库系统数据的完整性,它保证一组SQL语句要么全部都执行,
要么全部都不执行。(例如一批SQL语句,只要有一个执行失败就全部不执行,即回到失败前的状态
只有全部成功才会执行)。
例如A向B转账500块钱,先从A账户中扣除500,然后再再B账户中加500.
执行更新语句时,将A账户钱扣除500了,然后先B账户添加500的语句出错,即没收到钱。
此时A的钱被扣除了,B也没收到钱。这样显然是不行的,必须保证既然扣了钱就一定要转到,
或者没有转到就不要扣钱。
事务可以保证这样一组操作的稳定,使一组操作当成一个整体,使其具有原子性。
1.2执行事务
事务开始:begin;
语句1
语句2
...
commit
begin用于指定事务开始,commit用于手动提交事务。
之前写的SQL语句都是隐式的提交,即数据库管理软件自动的帮我们提交了。
但事务不会隐式的提交,所以需要我们手动提交。
我们先来看一个没加事务的例子:
现在hcf向zrx转账500,hcf的balance就变了500,zrx的balance就变成了2000;
因为语句中有ss,所以发生了错误,我们来看下表中数据。
执行了第一个更新语句,之后遇到了错误停止执行。
出现了钱扣了但是没有转到对方账户的情况。
这种情况显然是不允许发生的。
接下来我们为其添加事务。
再次执行语句也会出现错误,我们来看下表中数据。
这次虽然转账失败了,但是hcf的钱并没有被扣除。
这次是才是我们期望的情况,希望扣钱和到账保存一致性,同时成功或者同时失败。
1.3ROLLBACK
ROLLBACK用于对事务进行回滚,
1.3.1 rollback是针对事务的,你如果没有在执行语句之前开启事务,那么无法rollbac
1.3.2 rollback 回滚的意思。 就是数据库里做修改后 ( update ,insert , delete)未commit 之前 使用rollback 可以恢复数据到修改之前。
在开启事务,且没有COMMIT的前提下使数据恢复到修改之前(即回到这个事务开始前的状态)。
一个COMMIT或ROLLBACK都代表一个事务结束,例如事务已经COMMIT了,该事务就结束了,
则无法针对该事务使用ROOLBACK。COMMIT,ROLLBACK都是针对事务而言的。
可以看到由于ROLLBACK导致回到事务执行前,所有两条语句都未执行。
1.4保留点
使用ROLLBACK时直接返回事务开始状态,但有时可能某些操作是有用的,
这时我们就可以在事务中设置保留点,回滚时可以回滚到指定的保留点。
保留点之前的语句保存执行,保留点之后的语句不执行。
第一条语句执行了,而第二条语句没有执行。
参考资料:
《SQL必知必会》