MySQL_16.数据库事务相关概念

1.数据库事务
是指作为单个逻辑工作单元执行的系列操作,要么完全执行,要么完全不执行

2.事务的属性
(1)原子性 Atomicity:    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
(2)一致性 Consistency:    事务前后数据的完整性必须保持一致。
(3)隔离性Isolation:    事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离
(4)持久性Durability:    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

3.不考虑事务隔离性出现的问题
(1)脏读:就是一个事务读取到了另一个事务未提交的数据
(2)不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不—致。
(3)幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为 ABCDE 等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,
当系统管理员A改结束后发现还有条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

4.事务的四种隔离级别

事务隔离级别                 更新丢失        脏读           不可重复读     幻读    
---------------------------------------------------------------------------------
读未提交 Read uncommitted    不会出现       会出现          会出现        会出现
---------------------------------------------------------------------------------
读提交 Read committed        不会出现       不会出现        会出现        会出现
---------------------------------------------------------------------------------
可重复读 Repeatable read     不会出现       不会出现        不会出现      会出现
---------------------------------------------------------------------------------
串行化 Serializable          不会出现       不会出现        不会出现      不会出现
---------------------------------------------------------------------------------

(1)读未提交 Read uncommitted
最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果;所有的并发事务问题都会发生,解决了更新丢失
(2)读已提交 Read committed
只有在事务提交后,其更新结果才会被其他事务看见。解决了更新丢失、脏读
(3)重复读 Repeatable read
在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。解决了更新丢失、脏读、不可重复读。
(4)串行化 Serializable
事务串行化执行,隔离级别最髙,牺牲了系统的并发性。可以解决并发事务的所有问题。
注:
大多数数据库的默认隔离级别为: Read Commited读已提交 ,如 Oracle,DB2, Sql server。
少数数据库默认的隔离级别为 Repeatable read(可重复读),如 mysql Innodb存储引擎。
因为考虑到数据安全,请使用 Read Commited(读已提交)。


5.管理事务操作
(1)查询数据库事务隔离级别

show global variables like '%tx_isolation%';

(2)设置mysql的隔离级别tx_isolation 参数

set global tx_isolation = 'READ-COMMITTED';            --全局级别
set session tx_isolation = 'READ-COMMITTED';            --会话级别

(3)永久生效需要设置my.cnf参数文件、tx_isolation可选值:

READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE

(4)INNODB手动执行事务操作命令

start transaction;                           --开启事务
rollback;                                    --回滚事务
savepoint a;                                 --定义当前位置为保存点
rollback to a;                               --回滚至保存点 a
commit;                                      --提交事务


6.mysql事务隔离界别演示
(1)READ-UNCOMMITTED 读未提交
窗口A:

set session tx_isolation = 'READ-UNCOMMITTED';
create table scott.s1 (id int,name varchar(20));
start transaction;
select * from scott.s1;


窗口B:

set session tx_isolation = 'READ-UNCOMMITTED';
start transaction;
select * from scott.s1;


窗口A:

insert into scott.s1 values (1,'s1');        --不提交


窗口B:

select * from scott.s1;


窗口A:

rollback;


窗口B:

select * from scott.s1;


(2)READ-COMMITTED 读提交
窗口A:

set session tx_isolation = 'READ-COMMITTED';
start transaction;
select * from scott.s1;


窗口B:

set session tx_isolation = 'READ-COMMITTED';
start transaction;
select * from scott.s1;


窗口A:

insert into scott.s1 values (1,'s1');         --不提交
select * from scott.s1;


窗口B:

select * from scott.s1;


窗口A:

commit; 


窗口B:

select * from scott.s1;


(3)REPEATABLE-READ 重复读
窗口A:

set session tx_isolation = 'REPEATABLE-READ';
start transaction;
select * from scott.s1;


窗口B:

set session tx_isolation = 'REPEATABLE-READ';
start transaction;
select * from scott.s1;


窗口B:

insert into scott.s1 values (3,'s3');         --不提交
select * from scott.s1;


窗口A:

select * from scott.s1;


窗口B:

commit; 


窗口A:

select * from scott.s1;


窗口A:

commit;


窗口A:

select * from scott.s1;


(4)SERIALIZABLE 串行化
窗口A:

set session tx_isolation = 'SERIALIZABLE';
start transaction;
select * from scott.s1;


窗口B:

set session tx_isolation = 'SERIALIZABLE';
start transaction;
select * from scott.s1;


窗口B:

insert into scott.s1 values (4,'s4');         --不提交
select * from scott.s1;


窗口A:

select * from scott.s1; 


窗口B:

commit;


窗口A:

select * from scott.s1; 
commit;


 

  • 31
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微辣已是极限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值