事务。MySQL事务是对于更新(插入,修改,删除)来说的,查询好像没有事务不事务一说。
目录
(1)TransactionSample类编写(出错的时候)
一:JDBC事务介绍
MySQL之所以能在实际中使用,就是因为其有事务机制。MySQL,Oracle这样的关系型数据库都是支持事务的;也有很多小众的数据库是不支持事务的。
1.事务及事务区:
(1)【commit提交】
● 应用程序在写入数据时,并不是直接把数据放入到表中,而是先把数据放在事务区中;
● 事务区是MySQL自带的;如果数据很小的时候,事务区中的数据放在内存中,以加快处理速度;如果数据比较大的时候,其会用一块硬盘空间作为事务缓冲;
以A借给B100元为例:
首先,程序对A的余额作了减法操作,这是一个写操作,但是其不会直接反映到数据表中,而是先把这个操作的中间结果放在事务区中;
然后,程序对B的余额作了加法的操作,同样会把处理的中间结果放在事务区中
最后,当程序对这两个更新操作全部执行完以后,会主动的向MySQL发起一个commit提交的命令,这个commit提交命令会直接作用到MySQL事务区上;当MySQL看到程序进行commit事务提交后,于是MySQL的事务区会将刚才的加和减两个操作一次性的写入到数据表中;
即,进行程序的写操作的时候,两次的记录更新都是面向事务区的;只有当进行commit提交的时候,才由事务区真正的反映到数据表中(啰嗦一下:对于真正写入到数据表中的操作叫做“commit提交”);
当提交成功后,事务区中的数据的数据就没有意义了,由MySQL自动的把这个事务区清空,等待下一次应用程序再向事务区中进行新数据的写入。
……………………………………………………
(2)【rollback回滚】
以A借给B100元为例:
程序【对A的余额作了减法操作】操作正常;但是,由于某种原因程序【对B的余额作了加法的操作】的时候,程序报错了;那么JDBC的应用程序会向事务区发起一个【rollback回滚命令】;MySQL收到了这个回滚命令以后,其会直接将在事务区中原本已经处理好的【对A的余额作了减法操作】给清空;
即程序一旦向MySQL提交了【rollback回滚命令】以后,无论之前做了多少数据的前置处理,MySQL都会直接将事务区清空,最终的数据表中不会产生任何实质的写入操作;
事务总结一句话:作为事务来说,要么一次性全部完成;要么将之前所有已经做的事情通过回滚全部撤销。
实际的Java代码,主要是通过控制【commit提交】和【rollback回滚】命令的时机,只有应用程序发起了这样的命令,MySQL才可以执行对应的操作。
……………………………………………………
2.JDBC两种事务模式:
![](https://i-blog.csdnimg.cn/blog_migrate/a053b2696c96efddc6fc0c5296ebf992.png)
(1)自动提交事务模式:
自动提交事务模式是JDBC的默认模式。在每一次执行写操作(新增、修改、删除)的时候,每完成一次SQL语句都会自动的提交事务;
如果在程序中没有显式的写【conn.setAu