哎呀!“事务回滚”失效了

最近在学MySQL,最后还有一套传说中的测试习题,本来没把这个小小的习题放在心上,却不想在这小水沟里翻了船,真是尴尬呀。话不多少,直接上代码!

先是按照正常步骤走一遍,大众化路线,标准的代码,首先加载MySQL的数据库驱动,然后获取数据库连接connection,因为要测试数据库中事务的提交和回滚,所以我们需要把事务的自动提交关闭掉(第6行)

在写代码的时候,自己因为懒,就直接把之前写好的建表语句复制了过来,总共三句话,最后一句是错误的,存放在一个数组中,try代码块新建事务,并且在最后提交事务,catch代码块处理捕捉到的异常,并且增加了回滚语句。按照正常的的,执行了错误语句以后,程序会有异常发生,然后跳转到catch代码块中,执行回滚语句。但是我在刷新数据库以后,发现数据库多了两张表,这就意味着那三条数据库语句中的前两条语句已经执行成功,并没有回滚。哎呀呀,这是发生了什么呀?

你知道为什么吗?

真想永远只有一个~

我又测试了一些往表中添加数据的语句,发现在出错的情况下 ,是可以进行回滚操作的,表中的数据会回到事务执行之前状态。

那么,聪明的你是不是发现了一些什么呢?我后来在网上查了一些资料,得知在MySQL中,对表的创建、删除和更改表结构等操作是不可以回滚的,DDL操作直接触发隐式提交,隐式提交直接执行commit了,任何事务回滚的前提是没有commit,后续的rollback对前面的语句自然就无效了。如果想对建表语句回滚的话,可以在catch语句块里面,模拟回滚操作,判断表格否存在,存在就删除即可。具体的代码这里就不做实现了,有兴趣的自己去试一下,不知道你看懂了吗?

关注我们

三更编程菌

这里有神秘的彩蛋

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180611G06FAF00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券