ibatis 执行sql的事务控制问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ibatis 执行sql的事务控制问题相关的知识,希望对你有一定的参考价值。
在ibatis配置文件中,对同一个表配置了多个sql操作标签,如:先执行<insert>,再执行<update>,再执行<delete>,但这三次sql操作是在同一个Method中被调用执行,那在事务是如何控制的,在执行了<insert>之后,是否被commit了,如果没有,那在第二个<update>中要用到在<insert>中插入的数据,怎么办? 多谢了!
参考技术A 在数据访问层,一起处理SqlSession session = factory.openSession();
//用session来update、insert、delete等动作
session.close();
SQL语言 之 事务控制
一、概述
事务是一些数据库操作的集合,这些操作由一组相关的SQL语句组成(只能是 DML 语句),它们是一个有机的整体,要么全部成功执行,要么全部不执行。事务时数据库并发控制和恢复技术的基本单位。
事务就有ACID四个特性:
[1] 原子性(Atomicity):事务时数据库的逻辑工作单位,事务中的逻辑操作要么都做,要么都不做。
[2] 一致性(Consistency):事务的执行结果必须是使数据库从一个一致性状态转变到另一个一致性状态,不存在中间的状态。
[3] 隔离性(Isolation):数据库中一个事务的执行不受其他事务干扰,每个事务都感觉不到还有其他事务在并发执行。
[4] 持久性(Durability):一个事务一旦提交,则对数据库中数据的改变是永久性的,以后的操作或故障不会对事务的操作结果产生任何影响。
二、事务的隔离级别
1、事务的兵法运行可能导致如下三个问题:
[1] 丢失修改:两个事务同时读取数据库中的同一数据并进行修改,一个事务提交的结果破坏了另一个事务提交的结果,导致第一个事务对数据的修改丢失。
[2] 读“脏”数据:一个事务对数据的修改再提交之前被其他事务读取。
[3] 不可重复读:在某个事务读取一次数据后,其他事务修改了这些数据并进行了提交,当该事务重新读取这些数据时就会得到与前一次不一样的结果。
2、针对以上问题,Oracle提供两个级别的事务隔离
[1] READ COMMITED(提交读)
事务的默认隔离等级,用于设置语句级的一致性。每个事务所执行的查询操作只能获取在该查询开始之前(不是该事务开始之前)已经提交的数据。该隔离级别可以防止丢失修改和脏读的问题,但不能防止不可重复读的问题。在该级别的事务中可以执行 DML 操作(若数据被加锁则等待其他事务解锁)。
[2] SERIALIZABLE (串行化)
用于设置事务级的一致性,每个事务只能够看到在该事务开始之前已经提交的数据。该级别隔离可防止以上三个问题。在该级别的事务中可以执行 DML 操作(若数据被加锁则不等待,返回错误)。
如果数据库中具有大量并发事务,并且应用程序的事务处理能力和响应速度是关键因素,则 READ COMMITED 隔离级别比较合适。如果数据库中多个事务并发访问数据的概率很低,并且大部分的事务都会持续执行很长时间,适合 SERIALIZABLE 隔离级别。
设置和修改隔离级别,如下:
SET TRANSACTION ISOLATION LEVEL 隔离级别; ALTER SESSION SET ISOLATION_LEVEL = 隔离级别;
在Oracle数据库中,可以设置 READ ONLY(只读),每个事务只能看到在该事务开始之前已经提交的数据,并且不能在该事务中对数据进行 DML 操作,从而保证取得特定时间点的数据信息。
SET TRANSACTION READ ONLY;
三、事务处理
1、事务提交
Oracle数据库中,有两种方式:
[1] 用户执行 COMMIT 命令;
[2] 执行特定操作时,系统自动提交。
当事务提交后,用户对数据库的修改操作的日志由日志缓冲区写入到重做日志文件中,释放该事务所占据的系统资源和数据库资源。此时,其他会话可以看到该事务对数据库的修改结果。
当执行 CREATE、ALTER、DROP、RENAME、REVOKE、GRANT、CONNECT、DISCONNECT 等命令时,系统将自动提交。
2、事务回滚
通过 ROLLBACK 命令取消事务中的操作,执行该命令后,事务中的所有操作被取消,数据库恢复到事务开始之前的状态,同时事务占用的系统资源和数据库资源被释放。
如果只想取消事务中的部分操作,而不是取消全部操作,则可以在事务内部设置保存点,将一个大的事务划分为若干个组成部分,这样就可以将事务回滚到指定的保存点。
使用 SAVEPOINT 语句设置保存点。
INSERT INTO ... SAVEPOINT A UPDATE ... SAVEPOINT B
回滚:
ROLLBACK TO A; ROLLBACK TO B; ROLLBACK;
以上是关于ibatis 执行sql的事务控制问题的主要内容,如果未能解决你的问题,请参考以下文章
聊聊Spring事务控制策略以及@Transactional失效问题避坑
MySQL数据库——通过事务控制多条sql同时执行,如果成功就把数据全部写入硬盘,否则全部回滚
聊聊Spring事务控制策略以及@Transactional失效问题避坑