事务及传播行为

来源:互联网 发布:数据资源管理平台 编辑:程序博客网 时间:2024/06/05 07:23
事务控制语言(TCL):用来维护数据一致性的语句,包括提交(COMMIT)、回滚(ROLLBACK)、保存点(SAVEPOINT)三条语句,其中COMMIT用来确认已经进行的数据库改变, ROLLBACK语句用来取消已经进行的数据库改变,当执行DML操作后(也就是上面说的增加、修改、删除等动作),可以使用COMMIT语句来确认这种改变,或者使用ROLLBACK取消这种改变。SAVEPOINT语句用来设置保存点,使当前的事务可以回退到指定的保存点,便于取消部分改变。

(1)事务的概念:事务(Transaction)是访问并可能更新数据库中数据项的程序执行单元
(2)事务的特性ACID:
原子性(Atomicity):指在事务中包含所有操作,要么都做,要么都不做;
一致性(Consistency):数据的改变保证一直;
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力;
持久性(Durability):事务处理结束之后,对数据的修改是永久的,即便你的系统出现故障,也不会丢失;
(3)多个事务同时处理,会遇到的现象:
脏读:用户读了修改后未提交的数据;
不可重复读:读取同一条记录,但是两次数据不一样;
幻读:读取同一张表,两次记录数不一样;
(4)事务的隔离级别:
读未提交:允许幻读和不可重复读,脏读;
读提交(Oracle支持):允许幻读和不可重复读,但是不允许脏读;
重复读:允许幻读,但是不允许不可重复读和脏读;
串行化读(Oracle支持):都不允许幻读和不可重复读,脏读;

当在Service层声明事务后,Service层的方法除可以调用Dao层方法外,还可以调用其他Service方法,而这两个Service方法在事务管理上需要遵循一定的规则从而保证数据的一致性,这个规则即 事务传播行为

Spring的事务传播行为 分为以下几种:
(1)PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务
(2)PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行
(3)PROPAGATION_MANDATORY支持当前事务,如果当前没有事务,就抛出异常
(4)PROPAGATION_REQUIRES_NEW新建事务,如果当前存在事务,把当前事务挂起
(5)PROPAGATION_NOT_SUPPORTED以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
(6)PROPAGATION_NEVER以非事务方式执行,如果当前存在事务,则抛出异常

举例:
Service1{
void fun1(){
System.out.println("这里受事务1管理");
Service2.fun2();
}
}

Service2{
void fun2(){
System.out.println("这里受事务2管理");
}
}

当事务传播行为被声明为 PROPAGATION_REQUIRED ,执行fun1时,当事务1不存在,则新建事务,执行fun2时,当事务2不存在则用事务1,否则合并事务1、2,如果fun2内部发生异常,fun2和fun1都要执行回滚,当fun1发生异常,fun1和fun2也都要执行回滚

注意:事务回滚的前提是发生 RuntimeException ,自定义的异常需要继承 RuntimeException ,否则不会回滚



原创粉丝点击