mybatis中truncate,oracle清空表数据truncate
00-1010使用truncate清除表映射器接口XML文件事务方法。解释在事务处理方法中使用truncate时会发生什么
目录
使用truncate清空表
void truncate table();
00-1010 update id= truncate table truncate table name/update注意:它是更新标记,而不是删除标记。
Mapper接口
XML文件
在一个spring项目的事务方法中(使用@transactional注解):
首先,执行一条delete语句;然后执行truncate语句;最后,执行insert语句;
00-1010为什么delete语句和truncate语句执行成功,但是insert语句执行了却没有提交?
00-1010首先,在没有事务注释的方法中,所有与数据库的交互都由mybatis处理,
默认情况下,mybatis由事务自动提交,也就是说,每条sql语句在执行后都会立即提交。
在添加事务注解后,应用与数据库的交互会由spring和mybatis共同处理(所以它们要共用同一个数据源):
Spring管理事务,mybatis负责具体sql的执行。
那它们是如何协调的呢?
首先,spring会在开始时创建一个连接打开事务,并将连接放入当前线程本地。mybatis执行sql语句时,会从当前线程获取连接——,从而保证spring和mybatis使用同一个连接;mybatis执行sql后,会检查方法上是否有事务注释,如果有,则不会执行commit语句;最后,提交由spring执行。
这也就解释了一开始的问题:
执行truncate后,当前事务已被提交(虽然truncate比delete有更好的性能,但它是一个DDL语句,会触发事务提交)。当sql随后被执行时,它将不会被提交,因为mybatis检测到了事务注释。
Spring此时已经提交了事务,不会在方法结束时再次提交。
以上个人经验,希望能给大家一个参考,也希望大家能支持盛行的IT。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。