2.数据库事务
[JAVA]-数据库事务
[TOC]
1.数据库事务基础
<1>事务基础
事务的特性
数据库事务有四大特性: ACID --> 原子性 一致性 隔离性 持久性
原子性(Atomicity)
指事务在逻辑上是不可分割的操作单元,所有的语句要么都执行成功,要么都执行失败并进行撤销。
一致性(Consistency)
从一个状态转换为另外一个状态
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
隔离性(Isolation)
隔离性是针对并发而言。所谓的并发是指数据库服务器同时执行多个事务,如果在执行的过程中不采取有效的专门控制机制,并发事务之间会发生相互干扰
隔离性就是隔离并发运行的多个事务避免产生相互影响
持久性(Durability)
事务一旦提交对数据的修改就是持久性的,数据已经从内存转移到了外部服务器上,并执行了固化的步骤
数据库事务的组成
一个或者多个DML语句
一个DDL(数据定义语言)
一个DCL(数据控制语言)
使用commit 和rollback 进行事务的提交和事务的回滚
<2>控制事务
--创建表格
create table student(
sid number(10) primary key,
sname varchar2(20)
);
--数据测试
insert into student values(1,'张三');
insert into student values(2,'李四');
--设置保存点p1
savepoint p1;
select * from student;
--再次插入数据、修改数据
insert into student values(3,'王五');
update student set sname='noob' where sid=2;
--设置保存点p2
savepoint p2;
select * from student;
--测试删除数据
delete from student where sid=3;
select * from student;
--如果出现异常可以回滚到设置的保存点
--a.回滚到记录点p2
rollback to p2;
select * from student;
--b.回滚到记录点p1
rollback to p1;
select * from student;
--提交事务
commit;
<3>数据库事务的隔离级别
常见数据库事务问题:
问题一:什么是事务?
问题二:事务的四大特性是什么?详细解释:ACID
问题三:在数据库中由并发导致的各种问题包含哪些?
问题四:为了解决以上问题设计了哪些隔离级别详细解释?
什么是事务?
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务的完成由若干个DML语句组成的。
事务的四大特性?ACID
数据库事务有四大特性: ACID --> 原子性 一致性 隔离性 持久性
原子性(Atomicity)
指事务在逻辑上是不可分割的操作单元,所有的语句要么都执行成功,要么都执行失败并进行撤销。
一致性(Consistency)
从一个状态转换为另外一个状态
事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束
隔离性(Isolation)
隔离性是针对并发而言。所谓的并发是指数据库服务器同时执行多个事务,如果在执行的过程中不采取有效的专门控制机制,并发事务之间会发生相互干扰
隔离性就是隔离并发运行的多个事务避免产生相互影响
持久性(Durability)
事务一旦提交对数据的修改就是持久性的,数据已经从内存转移到了外部服务器上,并执行了固化的步骤
(1)原子性和一致性的区别?可否举例说明?
从概念上分析:原子性针对的是事务的操作;一致性针对的是数据状态的转化
原子性确保了事务中的操作要么全部成功,要么全部失败,保证了事务的独立性;而一致性则确保了事务对数据库的操作始终保持数据的一致性和完整性
举例说明:
在数据库中由并发导致的各种问题包含哪些?
由于数据库的隔离性导致的并发问题包括以下内容
对于同时运行的多个事务,当这些事务访问数据库中相同的数据,如果没有采取必要的隔离机制将会导致各种并发问题。
脏读
对于两个事务T1,T2 。 T1读取了已经被T2更新但是还没有提交的字段之后,如果T2发生了回滚,T1读取的内容就是无效的。
不可重复读
对于两个事务T1,T2。T1读了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,两次读取的值就是不同的。
幻读(虚读)
对于两个事务T1,T2 T1从一个表中读取一个字段,然后T2在该表中插入一个新的行之后,如果T1再次读取这个表发现数据行数变多。
丢失更新
是第一次提取的内容被第二次提交的内容进行了覆盖
为了解决以上问题设计了哪些隔离级别详细解释?
为了解决并发问题 数据库定义了四种隔离级别。隔离级别越高效率越慢,根据业务选择一个合适的隔离级别,在性能和安全上做平衡。
read_uncommitted:读未提交的数据
允许事务读取未被其他事务提交的变更,脏读,不可重复读,(虚读)幻读问题都会出现
read_commited:读已提交的数据
只允许事务读取已经被其他事务提交的变更,可以避免脏读,但是不可重复读和幻读依然存在
repeatableread:可重复读
确保事务可以多次从一个字段中读取相同的值,这个事务存在期间,禁止其他事务对这个字段进行更新,可以避免脏读,不可重复读但是幻读依然存在
serializable:串行化
确保可以从一个表中读取相同的行,这个事务存在期间禁止其他事务对该表进行插入、更新和删除操作。所有的并发问题都可以避免,但是性能十分低下
丢失更新:主要是使用乐观锁和悲观锁解决丢失更新。
并不是所有的数据库都支持这四种隔离级别
Oracle支持两种隔离级别 read_commited
、Serializable
,默认的隔离级别是read_commited
Mysql支持四种隔离级别 mysql的默认隔离级别是repeatableread