mysql学习十七之mysql的事务操作
一、什么是事务?
首先要先讲一个例子,银行的转账业务步骤:A同学向B同学转账50元。
1、首先A同学要往B同学转账,A同学账户先减去50元.
2、B同学账户增加50元。
3、若操作成功就提交事务。若操作失败就回滚到开始的位置,也就是说回滚到A同学转账之前。
事务是由一组SQL语句来操作单元,组内所有sql语句共同完成一个业务。如果整组成功,意味着全部SQL都实现。如果其中任何sql语句执行失败,那么意味着整个操作失败。意味着整个过程都没有意义,然后回到操作以前的状态。
二、事务是如何处理的?
1、失败后,可以回到开始位置。
2、没都成功之前,别的用户(进程,会话)是不能看到操作内的数据修改的。
思路就是在一组操作之间设置一个记号,用于备份,该记号相当于一个备份点。
三、事务的实现
事务的实现是利用了mysql数据库的innodb存储引擎的事务日志功能。
mysql的事务日志功能分成两个阶段:
1、执行阶段
2、将执行结果,提交到数据库的阶段。
mysql的数据库日志就是用来保存执行阶段的结果,如果用于选择提交,这才将结果提交到数据库。默认的执行方式叫:自动提交。执行完毕,自动完成提交工作。
如果要开启事务,那么首先要关闭自动提交功能。
1、查看自动提交是开还是关闭
show variables like 'autocommit';
2、开启自动提交
set autocommit=1;
关闭自动提交:
set autocommit=0;
如果关闭了自动提交,当执行sql语句时,执行完后其他用户查看数据库时并没有什么变化。改变的只是操作用户的数据库的内容。之所以其他用户没有发现问题是因为该事务没有完成,没有提交。
此时的数据库会自行判断所有的操作语句是否都执行成功,如果成功就将结果提交,失败就回到开始位置。利用commit,和回滚操作rollback。
3、其实不需要用set autocommit=0;这个语句,这个语句有个弊端,就是一旦执行了这个语句,整个数据库都是关闭自动提交。其他用户想执行自动提交的sql语句,也不行。
这里有更好的事务操作指令。
开启事务:Start trantransaction;这个开启事务,解决了另一个开启事务的弊端问题。提交后(无论成或失败)自动关闭事务。开启自动提交。成功用commit语句,失败用rollback语句。
四、事务的特点
原子性:是指事务的操作是不可分割的,也就是说,这个事务是多条sql语句构成,这些事务只有都执行成功了,才叫成功,否则就叫失败。没有一半的成功,一半的失败。
一致性:是指事务在执行时不允许其他进行操作,比如事务还没有提交,但是其他用户会操作数据库,这样就会由于事务没有操作完成而操作失败。
隔离性:隔离性是指事务的隔离性,两个用户对数据库进行操作,互不影响。
持久性:即事务一旦提交,就不能发生回滚了,因为提交事务后相当于已经完全映射到数据库了。
ACID属性。atomicity, consistency ,isolation, durability.
五、事务操作步骤
1、开启事务
2、书写需要的一组sql语句
3、提交事务。完成