一:基本知识
操作定义:
DML:数据操作语言,SQL中处理数据等操作统称为数据操纵语言。SELECT、UPDATE、INSERT、DELETE对数据操作,不修改表的结构,只修改表的内容,commit才能真正被执行。
DDL:数据定义语言,用于定义和管理 SQL 数据库中的所有对象的语言。主要有CREATE、ALTER、DROP等,主要是用在定义或改变表结构、数据类型、表之间的链接、约束等初始化工作。
DCL:数据控制语言,用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。
二:事务简述
事务:
事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
1、原子性
即不可分割,事务要么全部被执行,要么全部不执行
2、一致性
事务的执行使得数据库从一种正确状态转换成另外一种正确状态
3、隔离性
在事务正确提交之前,不允许把事务对该数据的改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应该显示给其他事务
4、持久性
事务正确提交之后,其结果将永远保存在数据库之中,即使在事务提交之后有了其他故障,事务的处理结果也会得到保存
事务问题:
1、脏读
所谓脏读,就是指事务A读到了事务B还没有提交的数据。
2、不可重复读
所谓不可重复读,就是指在一个事务里面读取了两次某个数据,读出来的数据不一致。
3、幻读
所谓幻读,就是指在一个事务里面的操作中发现了未被操作的数据。
隔离级别:
事务隔离级别有4种,但是像Spring会提供给用户5种,:
1、DEFAULT
默认隔离级别,每种数据库支持的事务隔离级别不一样,
2、READ_UNCOMMITTED
读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用
3、READ_COMMITED
读已提交,即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读
4、REPEATABLE_READ
重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。
REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决
5、SERLALIZABLE
串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
_______________________________________________________________________________________________________________________________
| | | | | |
| 隔离级别 | 脏读可能性 | 不可重复读可能性 | 幻读可能性 | 加锁读可能性 |
| Read uncommitted | 是 | 是 | 是 | 否 |
| Read committed--Sql Server , Oracle | 否 | 是 | 是 | 否 |
| Repeatable read--MySQL | 否 | 否 | 是 | 否 |
| Serializable | 否 | 否 | 否 | 是 |
|_______________________________________ |_________________ |_________________________|__________________|______________________|
数据库隔离级别:
MySQL:默认‘REPEATABLE-READ‘,可重复读
select @@tx_isolation;--查看当前会话隔离级别
select @@global.tx_isolation;--查看系统当前隔离级别
set session transaction isolatin level repeatable read;--设置当前会话隔离级别
set global transaction isolation level repeatable read;--设置系统当前隔离级别
Oracle:默认READ COMMITTED,读已提交,支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。
设置数据库事务的隔离级别
Set transaction isolation level read committed;--:
Set transaction isolation level serializable;
Set transaction read only;
设置整个会话的隔离级别:
Alter session set isolation level serializable;
Alert session set isolation level read committed;