- 第一章
- 事物的四个特性
- 原子性:就是包含的所有操作要么全部成功,要么全部失败回滚
事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
比如
:
转账的时候还没有成功
,
则就不能对数据库里面更改
,
如果更改则会出错
- 一致性: 从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
比如
:
转账之前
A
和
B
一共是
500 ,
那么
A
和
B
不管谁向谁转账
,
钱都是
500
- 隔离性:当多个用户并发访问数据库时,不能受到其他事物的影响
比如
:
操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离
4.持久性:事物一旦提交,对数据库的改变是永久的.
即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
比如:
例如我们在使用
JDBC
操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,
即使这时候数据库出现了问题,
也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
- 不考虑事务的隔离性,会发生的几种问题
- 脏读:
在一个事务处理过程里读取了另一个未提交的事务中的数据
比如
:
用户
A
向用户
B
转账
100
元
对应
SQL
命令如下
update
account
set
money
=
money
+
100
where
name
=
’B’; (此时A通知B)
update
account
set
money
=
money
-
100
where
name
=
’A’;
当只执行第一条
SQL
时,
A
通知
B
查看账户,
B
发现确实钱已到账(此时即发生了脏读),而之后无论第二条
SQL
是否执行,只要该事务不提交,则所有操作都将回滚,那么当
B
以后再次查看账户时就会发现钱其实并没有转。
- 2. 不可重复读(update)
- 一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
比如:
例如事务
T1
在读取某一数据,而事务
T2
立马修改了这个数据并且提交事务给数据库,事务
T1
再次读取该数据就得到了不同的结果,发送了不可重复读。
不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。
- 3. 虚读(幻读)(insert)
非独立执行时发生的一种现象
,
读取了另一条已经提交的事务
.
例如事务
T1
对一个表中
所有的行
的某个数据项做了
从
“1
”
修改
为
“2
”
的操作,这时事务
T2
又对这个表中
插入了一行数据
项,而这个数据项的数值还是为
“1”
并且提交给数据库。而操作事务
T1
的
用户如果再
查看
刚刚修改的数据,会发现还有
一行没有修改
,其实这行是从事务
T2
中添加的,就好像产生
幻觉
一样,这就是发生了幻读
幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是
不可重复读
查询的都是
同一个数据项
,而
幻读
针对的是
一批数据
整体(比如数据的个数)。
- 四种隔离级别
- Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
- Repeatable read (可重复读):可避免脏读、不可重复读的发生。
- Read committed (读已提交):可避免脏读的发生。
- Read uncommitted (读未提交):最低级别,任何情况都无法保证
隔离级别的设置只对当前链接有效