首先比如说我们要操作 一张名为 student 的表,这张表包含下面的几个字段

id、name、age

这个时候由我们的 jdbc 对数据库进行操作,或者是使用 orm 的持久层框架(mybatis、hibernate、jpa)

加入这个时候要插入一条记录 insert 

这个时候会先在数据库当中生成一张临时表,临时表记录的当前要插入的一些字段的信息,并且这张临时表会再当前数据库当中看看是否还有相同的记录存在,如果有相同的记录存在,那么则违反了主键的唯一性约束规则,这个时候返回给 java 的调用者 -1,表示插入失败,回滚事务,并且给出相应的数据库报错的信息。如果没有相同的主键,那么则执行插入的工作,插入结束之后进行提交事务,把记录变更到真实存在的表当中去。最后再干掉生成的临时表,这个完整过程即完成了数据库操作insert的过程。

流程如下图

mysql 事务 回滚sql 数据库事务回滚_临时表

如果是更新或者是删除数据库表中的数据也是同样的原理,首先查询当前为主键的记录是否存在,不存在的话直接报错

给java 程序,回滚事务,然后干掉临时表。   如果当前记录的主键存在,则对比临时表和查询出来的记录,把不相同的部分进行替换

工作,然后执行update。  如果是删除则直接执行删除。 最后提交事务,完成数据持久化,最后再干掉之前生成的临时

表记录。

 

而如果说程序员在程序当中手动的设置了数据库的事务的话,那么首先 startTransaction , 最后可以选择 commit 或者 rollback,这里如果使用了 rollback 的话,则会撤销当前的所有操作,回到 startTransaction 的原点。不对数据库进行表更,临时表也会被删除掉。