事务
什么是事务,事务的概念
-
一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败
就是将n个组成单元放到一个事务中
==》相当于 一组sql语句 事务可以确保这组sql语句要么全部成功,要不全部失败
-
JDBC会自动控制事务 自动开启事务(增删改的sql语句) 自动提交事务(commit) 事务提交后 数据永久保存在数据库里
-
如果一个功能只需要一条sql语句 默认的自动提交事务 可以满足
-
超过两条sql语句就无法满足 例如转账 需要多条SQL语句
张三转出10000 update accout money=money-10000 where name=“张三” 自动开启事务 提交事务 commit
- 出现异常 断电 张三钱少了 李四没收到钱
-
李四收钱
自动开启事务 update accout set money=money+10000 where name=“李四” 自动提交事务 commit
aga系统全局区
pga(用户内存)
plsq操作pga insert into 在pga保存 comity提交到aga 在写到dbf文件
tablespace 表空间 有n个xxx.dbf文件 create tablespace
-
手动开启事务 执行SQL语句1 SQL语句2 手动提交事务 commit
-
手动开启事务 执行SQL语句1 出现异常(停电) rollback(回滚) 撤销异常前所有成功的sql语句撤销 SQL语句2 手动提交事务 commit
-
手动控制事务需要jdbc模板 事务控制之和Connection对象有关
-
Connextion conn=DriverManage.getConnection("url","user","pass"); try{ conn.setAutoCommit(flase)//改成手动提交事务 即手动开启了一个事务 Sql-1; Sql-2; conn.commit(); }catch(Exception ex){ conn.rollback(); }
-
多条SQL语句像在同一个事务里 必须共用同一个开启事务的connection
事务的特性和隔离级别
事务的四大特性(acid)
- 原子性:事务中所有操作是不可再分割的原子单位,事务中所有的操作要不全部成功,要不全部失败
- 一致性:事务执行后数据库状态与其他业务规则保持一致。如转账无论事务执行是否成功 两个转账账号余额之和是保持不变的
- 隔离性:隔离性是指在并发操作中,不同事物之间应该隔离开来 使每个并发中的事务互不干扰
- 持久性:一旦事务提交成功,事务中所有的数据操作必须被持久化到数据库中,即便提交事务后,数据库马上崩溃,在数据库重启时l 也必须能保证通过某种机制恢复数据。
事务的隔离级别
1.事务的并发读问题
- 胀读: 读取到另一个事务未提交数据( 一个事务读取到了另一个事务未提交的数据 也就是读取到了胀读数据 发生胀读)
- 不可重复读:(两次读取不一致 由于一个事务在运行过程中 另一个事务更新了记录 所以第一个事务对同一次记录的两次查询结果不一致 产生了不可重复读)
- 幻读(虚读):读到另一事务已提交数据( 由于一个事务在运行过程中 另一个事务插入了新的记录,所以第一个事务对表的两次查询结果不一致 产生了幻读)
- 不可重复读和幻读的区别:不可重复读是读取到了另一事务的更新,幻读是读取到了另一事务的插入(MySQL中无法测试到幻读);
2.四大隔离级别
-
SERIALIZABLE(串行化)
- l 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
- l 性能最差;
-
REPEATABLE READ(可重复读)(MySQL)
-
l 防止脏读和不可重复读,不能处理幻读问题;
-
l 性能比SERIALIZABLE好
-
-
READ COMMITTED(读已提交数据)(Oracle)
- l 防止脏读,没有处理不可重复读,也没有处理幻读;
- l 性能比REPEATABLE READ好
-
READ UNCOMMITTED(读未提交数据)
- l 可能出现任何事务并发问题
- l 性能最好
脏读
事务1:张三给李四转账100元
事务2:李四查看自己的账户
事务1:开始事务
事务1:张三给李四转账100元
事务2:开始事务
事务2:李四查看自己的账户,看到账户多出100元(脏读)
事务2:提交事务
事务1:回滚事务,回到转账之前的状态
不可重复读
事务1:酒店查看两次1048号房间状态
事务2:预订1048号房间
事务1:开始事务
事务1:查看1048号房间状态为空闲
事务2:开始事务
事务2:预定1048号房间
事务2:提交事务
事务1:再次查看1048号房间状态为使用
事务1:提交事务
对同一记录的两次查询结果不一致!
幻读
事务1:对酒店房间预订记录两次统计
事务2:添加一条预订房间记录
事务1:开始事务
事务1:统计预订记录100条
事务2:开始事务
事务2:添加一条预订房间记录
事务2:提交事务
事务1:再次统计预订记录为101记录
事务1:提交
对同一表的两次查询不一致!
不可重复读和幻读的区别:
不可重复读是读取到了另一事务的更新;
幻读是读取到了另一事务的插入(MySQL中无法测试到幻读)