(1) 什么是事务?
事务就是被绑定在一起,作为一个逻辑工作单元的sql语句组。
(2) 事务的特性(ACID)
① 原子性:是一个逻辑工作单元,要么都成功,要么都失败。如果事务执行过程当中,有任意一个sql语句出现异常,则整个事务回滚。
② 一致性:数据库数据必须从一个一致状态到另外一个一致状态,逻辑上不能出现错误。
例如转账 张三给李四转100块钱。 如果事务成功,那么张三一定减一百,李四一定加一百。如果事务失败,张三扣的一百一定会滚到原状态。
③ 隔离性:一个事务与另外一个事务之间不能相互干扰。通常数据库可以设定不同的事务隔离级别。
④ 持久性:事务一旦提交,对数据的修改是永久的。
(3) 事务的并发问题
在多线程的情况下,多个用户同时对一条数据做操作,那么就可能导致数据库操作结果不正确。常见的问题有三个:
① 脏读:A事务读取到了B事务没有提交的数据,如果B事务回滚啦,那么A事务读取到的就是脏数据。我们称之为脏读。
② 不可重复读:在同一个事务中,对同一份数据多次读取的结果不一致。原因在于读取期间,其他事务修改了该数据。事务并发修改导致。
③ 幻读:在同一个事务中,多次同样的查询返回的记录条数不同。原因在执行期间,其他事务对记录进行了增加和删除操作。
(4) 为了解决并发问题,数据库提供了事务的隔离级别的设定。主要的隔离级别有四个:
① 读未提交:级别最低,事务能够读取到另外一个事务没提交的内容,不能解决任何并发问题。
② 读已提交:可以避免脏读。
③ 可重复读:可以避免脏读和不可重复读。
④ 串行化:最高级别。可以避免脏读,不可重复读,和幻读。但是效率低。
Oracle中只有读已提交和串行化两种事务隔离级别。默认是读已提交。