关于 Spring 事务 理解(3)

  此处有一句int i=1/0;是故意制造的异常,在声明式事务中,整个方法就是一个事务,当方法执行完后提交事务,如果事务提交出现异常则回滚到提交前的状态,也就是之前执行的sql语句全部作废掉,这个方法中我们首先对同一条数据做了两次更改,然后通过查询语句查出所有数据并打印,讲道理,执行结果应该是查出来的第一条id=1的语句的username被改成了“改2次”,并且数据库中的数据也是改两次,但是执行结果如下:

  看样子好像没毛病,但是看数据库发现原来的数据并没有被修改过来,而是保持原来的样子,

  出现这种情况的原因是,声明式事务的特点是把整个方法当成事务提交,事务提交的过程中的确修改了数据库,并且查询出了修改后的数据(因为查询语句和打印语句都在事务中),然后当事务执行到int i=1/0的时候报错了(众所周知除数不能为0),产生了异常,所以整个事务的提交是有异常的,那么存在异常的事务将会被回滚,撤销原来的数据库操作,所以数据库的数据就被还原了,这也符合数据库原子性和一致性的特性。这也就出现了我们看到的查询结果明明有变,但是数据库数据却没有改变的情况。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d94447d92b5394097ec76eb2af13b4d4.html