初学事务处理的笔记
对于自学的我来说,之前接触到数据库的知识就是增删改查,一涉及什么事务就很蒙,不知道什么意思,今天找了一本入门Mysql看了一下,写一点收获笔记
我们都知道MySQL支持好几种基本的数据库引擎,什么MyISAM,InnoDB,虽然不知道什么意思,但或多或少都看过这个字眼。先说一下区别,MyISAM不支持事务处理,InnoDB支持事务处理,根据是否需要事务处理选择对应的引擎。
什么是事务和事务处理
- 事务(transaction):是一组SQL语句
- 事务处理:说它是一种机制,这个机制就是用来保证SQl的操作是成批进行的(也就是事务处理块中的sql),保证在一个块中的sql要么完全执行,要么完全不执行。
我感觉就像是java里面的synchronize同步锁一样,让一组sql语句具有原子性
为什么要有事务处理
假如A给B转10块钱,有两条update语句,第一条update让A少10块钱,第二条让B多十块钱。 不巧的是刚执行完第一条语句,突然数据库出现故障了,让10块钱消失了。这就出现大问题了。
写事务处理
介绍一下这几个关于事务处理的词
- 事务(transaction):是一组SQL语句
- 回退(rollback):撤销指定sql语句的过程
- 提交(commit):将未存储的sql语句结果写入数据库表
- 保留点(savepoint):在事务处理中设置一个标记(placeholder占位符),你可以对它发布回退(与回退整个事务处理不一样)
用例测试
- 开启一个事务处理
- 删除user表中的所有行(user表中是有数据的)
- 再查看这个表的状态
- 执行撤销操作
- 再查看状态
第一条语句执行结果如下:因为delete了所以数据都没了
第二条语句执行结果如下: 数据又都回来了!!!!
总结ROLLBACK:可以回退的语句 ,有insert,update,delete,不能回退select(因为没有啥意义啊,前3条语句都是可以对表产生影响的,select就是看看数据)
commit的用法
autocommit
只用在InnoDb引擎中 :因为InnoDB支持事务处理
- 在InnoDB中:
update tablenam set id = 999 where id = 1;(缓存生效)
commit;(真实生效) - MyISAM:
update tablenam set id = 999 where id = 1;(缓存生效)
autocommit这个参数默认是on,每条sql‘语句自动的执行提交操作。
关闭autocommit后,在每条sql语句都得有commit操作
然而不管autocommit参数为0还是1,只要start transaction;autocommit就失效(也就是说这个参数是对没开启事务的sql语句有效),必须加上commit
执行完rollback或者commit事务就会结束
保留点(savepoint)
配合rollback使用,相当于一个标记,使用rollback可以撤销到savepoint的部分