事物与存储过程
把准备工作都做好~~~
注意!!!在表后面搞一个引擎ENGINE=InnoDB,这对后面有帮助
1、事务的概念
事务就是针对数据库的一组操作,它可以由一条或多条SQL语句组成,同一个事务的操作具备同步的特点,事务中的语句要么都执行,要么都不执行。
事务有很严格的定义,它必须同时满足四个特性:
(1)原子性
原子性是指一个事务必须被视为一个不可分割的最小工作单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。
(2)一致性
一致性是指事务将数据库从一种状态转变为下一种一致的状态。(例如,在表中有一个字段为姓名,具有唯一约束,即姓名不能重复,如果一个事务对姓名进行了修改,使姓名变得不唯一了,这就破坏了事务的一致性要求,如果事务中的某个动作失败了,系统可以自动撤销事务,返回初始化的状态。)
(3)隔离性
隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
(4)持久性
事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。需要注意的是,事务的持久性不能做到100%的持久,只能从事务本身的角度来保证永久性,而一些外部原因导致数据库发生故障,如硬盘损坏,那么所有提交的数据可能都会丢失。
①开启事务
格式:START TRANSACTION;
②提交事务
当用户确认提交后,事务中的操作才会执行成功,这个过程就是手动提交的过程
格式:COMMIT
a、执行转账语句,提交事务
翻译:通过UPDATE语句将a账户的100元钱转给b账户,最后提交事务
使用SELECT语句来查询account表中的余额
b、执行转账语句,不提交事务
如图,在事务中实现了转账功能。此时最好把三个语句(如图2)写在一起,不要分开(如图1),方便后面演示
此时,退出数据库然后重新登录,并查询数据库中各账户的余额信息,查询结果如下:
结论:在事务中转账成功后没有提交事务就退出了数据库,由于事务中的语句不能自动提交,因此当前的操作会被自动取消。
c、执行转账语句,提交事务
在添加了COMMIT后,退出数据库然后再重新登录,使用SELECT语句查询数据库中各账户的余额信息,查询结果如下:
如图,已经实现了转账功能
结论:事务中的操作都是手动提交的,因此在操作完事务时,一定要使用COMMIT语句提交事务,否则事务操作会失败。
③事务的回滚
格式:ROLLBACK;
上述b中可以看出,a账户成功给b账户转账100元钱,如果此时a账户不想给b账户转账了,由于事务还没有提交,就可以将事务回滚
如图,回滚操作成功,当前事务中的操作取消了