MYSQL事务

事务的概念

事务是一个原子操作。是一个最小执行单元。可以由一个或多个SQL语句组成,在同一个事务当中,所有的SQL语句都成功执行时,整个事务成功,有一个SQL语句执行失败,整个事务都执行失败。

事务的特性(ACID)

表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败

表示一个事务内有一个操作失败时,所有的更改过的数据都必须回滚到修改前状态

  • Isolation(隔离性)
       事务查看数据操作时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。

    • 脏读:在读取数据的时候,另外一个事务还没有提交,读取事务的时候也能读到未提交的之后的事务结果。
    • 不可重复读:读取数据时,能读到事务提交之前和提交之后的结果。
    • 幻读:读取数据时,读到的事务提交之的正确的数据,但是插入时会失败,是因为本地读的事务没有提交导致。解决方法:提交本地读的事务。
  • Durability(持久性)
    持久性事务完成之后,它对于系统的影响是永久性的。

事务隔离级别

  • 序列化(SERIALIZABLE)
  • 可重复读(REPEATABLE READ mysql默认隔离级
  • 提交读(READ COMMITTED)
  • 未提交读(READ UNCOMMITTED)

序列化(SERIALIZABLE)

如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供
了事务之间最大限度的隔离。

可重复读(REPEATABLE READ mysql默认隔离级

在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍
然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总
是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。

提交读(READ COMMITTED)

READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于
READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,
如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。

未提交读(READ UNCOMMITTED)

READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复
的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其
他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了
大量的数据变化。

sql演示
窗口1:

#事务的隔离级别
/*
序列化(SERIALIZABLE)
可重复读(REPEATABLE READ)
提交读(READ COMMITTED)
未提交读(READ UNCOMMITTED)
*/

#查看当前全局隔离级别
SELECT @@GLOBAL.transaction_isolation;

#查看当前会话隔离级别
select @@transaction_isolation;

#修改当前会话的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

#测试脏读
#开启事务
START TRANSACTION;
update user set  money = money-100 where username= "zhangsan";

COMMIT;


#修改当前会话的隔离级别,查看当前会话级别,修改成功
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

#测试不可重复读:读到事务提交之前和提交
#开启事务
start TRANSACTION;
update user set  money = money+100 where username= "zhangsan";

COMMIT;

#测试幻像读
#开启事务
start TRANSACTION;
#插入一条数据
insert into user(username,money) values("wangwu",800);
COMMIT;

窗口二:

#test 测试脏读:读到会话1还未提交的结果,隔离级别低,也就是随时可读

START TRANSACTION;
select * from user where username = "zhangsan";
COMMIT;

#test 2
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select @@transaction_isolation;

#测试不可重复读:先执行前两行代码,等前面一个事务会话开启了之后,再次执行出现了两次不同的结果(分别为1000和1100)。
START TRANSACTION;
select * from user where username = "zhangsan";

COMMIT;

#测试幻读 先执行查询代码,只有两条数据。在插入一条wangwu的数据,在执行查询(会有wangwu这条1数据),然后再执行delete语句删掉wangwu 会发现删不掉(出现幻像,明明有这条数据,但是删不掉),因为插入语句的事务没有提交.

START TRANSACTION; 
select * from user;
delete user where username = "wangwu";
COMMIT;

总结:

隔离级别 脏读 不可重复读 幻象读
READ UNCOMMITTED 允许 允许 允许
READ COMMITED 不允许 允许 允许
REPEATABLE READ 不允许 不允许 允许
SERIALIZABLE 不允许 不允许 不允许

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值