欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据库基础】事务的特性、隔离级别、修改隔离级别

程序员文章站 2022-05-09 17:21:23
...

在当前巨大的数据操作的需求下,保证数据的一致性就必然会用到数据的事务。

 

什么是事务?

事务是逻辑上一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。

本地事务指的则是该事务仅在当前的工程内有效

 

事务的四个特性(ACID)

1、ATOM

     “原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。

2、Consisdency

     “一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执行之前数据是正确的,事务执行之后数据仍然是正确的。如果一个事务在执行的过程中,其中某一个或某几个操作失败了,则必须将其他所有操作撤销,将数据恢复到事务执行之前的状态,这就是回滚。

3、Isloation

    不同的事务之间应该保持互相之间不受影响。例如A给B转账 ,C给D转账 包括B给C转账都应该不受影响。

4、Durability

    指的是将数据持久化到容器当中。

 

读问题

事务并发引起一些读的问题:

  • 脏读 一个事务可以读取另一个事务未提交的数据

  • 不可重复读 一个事务可以读取另一个事务已提交的数据 单条记录前后不匹配 (锁行)

  • 虚读(幻读) 一个事务可以读取另一个事务已提交的数据 读取的数据前后多了点或者少了点 (锁表)

脏读是不被允许的,后两者是可以存在的。

不可重复读举个例子就是A给B转账的时候,他老婆也用同一个账户给别人转账,此时通知A的是他老婆跟他一块转账之后得到的短信通知,A就觉得怎么数目不对啊。

虚读就是举个例子就是说比如HR在操作人员表调整薪资上涨10%,然后另一个HR在新增员工数据,那第一个HR都整完了发现怎么还有几条数据(新增的那几条)没有改过。

不可重复读是针对 同一条数据,虚读是针对不同的数据。

解决不可重复读需要锁行,解决虚读的话需要锁表。

 

隔离级别

【数据库基础】事务的特性、隔离级别、修改隔离级别

加深一下印象,读未提交,读已提交,可重复读,可串行化(序列化读)

mysql默认的级别是可重复读

Oracle默认的级别是读已提交,因此他速度更快一点

 

修改隔离级别

这是我们使用   select @@tracscation_isolation 查询到的隔离级别,它是一个关键字

【数据库基础】事务的特性、隔离级别、修改隔离级别

我们模拟一下可重复读可以避免幻读的那种情况

set session transaction isolation level read committed;

使用两个命令框开启两个事务    start transaction;

事务一:

start transaction;

select * from user ;  先查第一次

select * from user ;  事务二commit之后再查第二次,发现结果没变,这就是避免了虚读

事务二:

start transaction;

insert into user(name,age)  values ("ahui","23");

commit;

相关命令:

查看全局事务隔离级别:SELECT @@global.transaction_isolation

设置全局事务隔离级别:set global transaction isolation level read committed;

**查看当前会话事务隔离级别:SELECT @@transaction_isolation**

**设置当前会话事务隔离级别:set session transaction isolation level read committed;**

查看mysql默认自动提交状态:select @@autocommit

设置mysql默认自动提交状态:set autocommit = 0;【不自动提交】

开启一个事务:start transaction;

**提交事务:commit**

**回滚事务: rollback**

在事务中创建一个保存点:savepoint tx1

回滚到保存点:rollback to tx1

 

 

 

 

 

相关标签: 数据库