数据库的事务的基本特性

事务并发控制的基本单位,保证事务ACID的特性是事务处理的重要任务,而并发操作有可能会破坏其ACID特性。 

所以事务是针对并发而言的,即 对 数据 在并发操作时保驾护航。 


原子性:Atomicity [,ætə'mɪsɪtɪ]、 一致性:Consistency [kən'sɪst(ə)nsɪ]

隔离性:Isolation [aɪsə'leɪʃ(ə)n]、持久性 :Durability [djʊrə'bɪləti]

原子性:在我理解看来是,事务中各项操作,要么全部成功要么全部失败。很有江湖义气一说,同生共死。

一致性:我理解的是更侧重结果,事务结束后系统状态是一致的。

隔离性:并发执行的事务彼此无法看到对方的中间状态。

持久性:当事务完成后,它对于数据的改变是永久性的,即使出现致命的系统故障也将一直保持。


在实际生产应用中 针对 事务的隔离性 又划分出了几种隔离级别

事务隔离级别脏读不可重复读幻读数据库默认级别

未提交读(Read uncommitted)

可能

可能

可能

 

已提交读(Read committed)

不可能

可能

可能

Oracle / SQL Server

可重复读(Repeatable read)

不可能

不可能

可能

 MySQL

可串行化(SERIALIZABLE)

不可能

不可能

不可能

 

并发事务处理带来的问题

  • 更新丢失

  当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题–最后的更新覆盖了由其他事务所做的更新

  • 脏读:在一个事务处理过程中读取了另一个未提交事务中的数据。

解读:两个事务 A 和 B,首先 A 事务对 数据 a 执行加 500 的操作 a = 1500,此时 B 事务读取数据 a  的值 1500,后 A 事务 又对数据 a 执行减500 的操作 a = 1000 ,A  事务 commit 。

 

  • 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

解读:两个事务 A 和 B,首先 A 事务对 数据 a 进行查询 a = 1000,此时 B 事务对数据 a + 500 操作,并提交事。后 A 事务 又对 数据 a 进行查询 a = 1500 。

幻读:事务 A 将数据库中所有数据类型从默认的 true 改成 false,但是事务 B 就在这个时候插入了一条新记录,当事务 A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

 

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表。

MySQL

1.查看当前会话隔离级别

select @@tx_isolation;

2.查看系统当前隔离级别

select @@global.tx_isolation;

3.设置当前会话隔离级别

set session transaction isolatin level repeatable read;

4.设置系统当前隔离级别

set global transaction isolation level repeatable read;


Oracle

oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。

1.查看系统默认事务隔离级别,也是当前会话隔离级别

--首先创建一个事务
declare
     trans_id Varchar2(100);
  begin
     trans_id := dbms_transaction.local_transaction_id( TRUE );
  end; 

--查看事务隔离级别

SELECT s.sid, s.serial#,

  CASE BITAND(t.flag, POWER(2, 28))
    WHEN 0 THEN 'READ COMMITTED'
    ELSE 'SERIALIZABLE'
  END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');


SQL Server

查看系统当前隔离级别

DBCC USEROPTIONS 

isolation level 这一项的 Value 既是当前的隔离级别设置值

2.设置系统当前隔离级别

SET TRANSACTION ISOLATION LEVEL Read UnCommitted;

其中Read UnCommitted为需要设置的值

 

DBMS 数据库管理系统(Database Management System)

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值