回顾什么是事务?
多个不可分割的操作形成一个整体,该整体要么全部执行成功,要么全部执行失败。例如:转账;
回顾为什么要用事务?
如果不用事务的话,以转账为例,可能出现一个用户钱被扣了,但是另一个用户的钱却没有增加;
回顾在项目中,事务应该用于哪一层?
事务要放在业务层;
回顾 jdbc 中,如何使用事务?
connection.setAutoCommit(false); // 开启事务
pstmt.executeUpdate(); // 操作数据库
connection.commit(); // 提交事务
connection.rollback(); // 回滚事务
回顾 hibernate 中,如何使用事务?
transaction.begin(); // 开启事务
session.save(new User()); // 操作数据库
transaction.commit(); // 提交事务
transaction.rollback(); // 回滚事务
回顾 spring 编程中,如何使用事务?
spring 可以分为二种:
>编程式事务,藕合
>声明式事务,解藕,提倡
注意:
jdbc/dbutils 速度快,但书写烦;
mybaits 速度中等,但书写"中等";
hibernate 速度慢,但书写"爽";
回顾 MySQL 的事务开始:start transaction;
Oracle 的事务只针对 DML 操作,即 select/insert/update/delete;
Oracle 的事务开始:第一条 DML 操作做为事务开始;
Oracle 的提交事务:
(1)显示提交:commit;
(2)隐藏提交:DDL/DCL/exit(在 sqlplus工具中操作),例如:
注意:提交的是从事务开始到事务提交之间的内容,提交到 ORCL 数据库中的 DBF 二进制文件;
Oracle 的回滚事务:
(1)显示回滚:rollback
(2)隐藏回滚:关闭窗口(sqlplus工具),死机,掉电
注意:回滚到事务开始的地方;
回顾什么是回滚点?
在操作之间设置的一个标志位,用于将来回滚之用;
回顾为什么要设置回滚点?
如果没有设置回滚点的话,Oracle 必须回滚到事务开始的地方,其间做的一个正确的操作也将撤销;
使用savepoint 回滚点,设置回滚点 a:
savepoint a;
使用 rollback to savepoint,回滚到回滚点 a 处:
rollback to savepoint a;
注意:Oracle 提交或回滚后,原来设置的回滚点无效了;
回顾 MySQL 支持的四种事务隔离级别及能够解决的问题:
(1)read uncommitted -- 不能解决任何缺点
(2)read committed -- 脏读,Oracle默认
(3)reapatable read -- 不可重复读,脏读,MySQL默认
(4)serializable -- 幻读,不可重复读,脏读,效率低
Oracle 只支持两种事务隔离级别:
read committed 和 serializable;
Oracle 中设置事务隔离级别为 serializable
set transaction isolation level serializable;
演示两个用户同时操作 emp 表,删除 SCOTT 这条记录,会有什么后果?
因为有隔离级别的存在,所以不会出现两个用户都删除了 SCOTT 这条记录;
一定是一个用户删除 SCOTT 成功,在该用户没有提交的情况下,另一个用户等待;