事务
-
什么是事务?
举例说明:
银行中A账户向B账户转账1000元,数据库执行两条update语句,两条update语句必须同时成功或者同时失败,不能出现一条成功一条失败的情况,而事务就是来处理这种情况的。
需要注意的是只有DML语句才有事务机制,这个不难理解,因为只有DML语句对数据库中的数据进行操作
-
事务的原理
-
事务的四大特性(ACID)
- A:原子性:保证事务是最小的单位,不可再分
- C:一致性:保证同一事务中的DML语句同时成功或者同时失败
- I:隔离性:保证事务A和事务B相互隔离
- D:持久性:持久性说的是最终数据必须持久化的硬盘中,整个事务才算结束
-
事务的隔离性
事务的隔离性存在于多个事务之间,假定事务A和事务B同时访问一个数据库并对其数据进行操作
理论上事务的隔离性存在4个级别
-
第一级别:读未提交(read uncommitted)
事务A在操作数据,事务B进来读取数据,可以读到事务A为提交的数据
出现的问题:脏读(dirty read),读取到脏数据(不一定有用的数据)
-
第二级别:读已提交(read committed)
事务A在操作数据,事务B来读取数据,可以事务A已提交的数据
出现的问题:不可重复读。
解释一下什么是不可重复读:事务B早上十点读取一条select语句,而在过程中事务A操作了事务B读到的数据并提交,这时候事务B在读数据就会出现与原数据不符的现象
-
第三级别:可重复读(repeatable read)
解决了不可重复读问题
出现的问题:读到的数据是幻象
-
第四级别:序列化读(serializable)
解决了读到的数据是幻象的问题
缺点:类似于多线程的锁机制,需要排队进行,效率低
-
Oracle数据库默认隔离级别为第二级别
-
MySQL数据可默认隔离级别为第三级别
-
-
设置事务的全局隔离级别
set global transaction isolation level 级别
-
查看事务的全局隔离级别
select @@global.transaction_isolation