Mysql事务的隔离级别和锁

事务:
第一种隔离级别:Read uncommitted(读未提交)
第二种隔离级别:Read committed(读提交)
第三种隔离级别:Repeatable read(可重复读取)
第四种隔离级别:Serializable(可序化)
图片: https://uploader.shimo.im/f/gsqj94UXhDFLbK8D.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2NDg0NjU0OTMsImciOiJlMUF6NE80eDg0Q0JROXFXIiwiaWF0IjoxNjQ4NDY1MTkzLCJ1c2VySWQiOjM4NzAxMjQzfQ.Fx_4-1-sstb8y0MxVPRLTnMQ8ptIYzhemiuFCCJbASY

-- 查询默认的隔离机制
select @@transaction_isolation;

-- 模拟未提交的操作--------------
-- 开启事务
begin;

SELECT * FROM `sys_users`  where id = 2;

-- 操作数据库
UPDATE  sys_users set username = '123345' WHERE id = 2;

-- 回滚
ROLLBACK;


-- 模拟提交的操作
begin;
UPDATE  sys_users set username = '123345' WHERE id = 2;
COMMIT;
-- ----------------------------------

-- 以下为复杂操作
1-- 关闭自动提交
SET autocommit = 0;

-- 修改默认的隔离级别   READ UNCOMMITTED  读取未提交----------------------
-- 去读未提交的信息
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 查找隔离情况
select @@transaction_isolation;

begin;
SELECT * FROM `sys_users`  where id = 2;
ROLLBACK;

2-- 修改默认的隔离级别   READ COMMITTED  读取已提交-----------------
-- 去读已提交的信息
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 查找隔离情况
select @@transaction_isolation;
SET autocommit = 0;

begin;
SELECT * FROM `sys_users`  where id = 2;
ROLLBACK; 
COMMIT;

3、
– 修改默认的隔离级别 REPEATABLE READ 可重复读-----------------
– 保留第一次进来的读取值,别人的不影响该事务查找的值
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
– 查找隔离情况

select @@transaction_isolation;
SET autocommit = 0;

begin;
SELECT * FROM `sys_users`  where id = 2;
ROLLBACK; 
COMMIT;

4、
– 修改默认的隔离级别 SERIALIZABLE 可序列化-----------------

– 一个事务没有提交,另一个事务会卡在那里

SET SESSION TRANSACTION ISOLATION LEVEL  SERIALIZABLE;
-- 查找隔离情况
select @@transaction_isolation;
SET autocommit = 0;

begin;
SELECT * FROM `sys_users`  where id = 2;
ROLLBACK; 
COMMIT;

-- 假设并发打断代码
begin;
--悲观锁
SELECT * FROM `sys_users`  where id = 2 for UPDATE
--乐观锁
SELECT * FROM `sys_users`  where id = 2 and username='ddd'

-- 可以改变事务查看update后的结果
UPDATE  sys_users set username = 'ccc' WHERE id = 2;
--回到上个语句查看select的结果
--SELECT * FROM `sys_users`  where id = 2;
COMMIT;
ROLLBACK;

锁:
图片: https://uploader.shimo.im/f/sXafpH1yFyvIMR21.png!thumbnail?accessToken=eyJhbGciOiJIUzI1NiIsImtpZCI6ImRlZmF1bHQiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJhY2Nlc3NfcmVzb3VyY2UiLCJleHAiOjE2NDg0NjU0OTMsImciOiJlMUF6NE80eDg0Q0JROXFXIiwiaWF0IjoxNjQ4NDY1MTkzLCJ1c2VySWQiOjM4NzAxMjQzfQ.Fx_4-1-sstb8y0MxVPRLTnMQ8ptIYzhemiuFCCJbASY

– 锁 悲观锁
begin;
–数据库层面加锁
SELECT * FROM sys_users where id = 2 for UPDATE;
ROLLBACK;
COMMIT;

– 乐观锁 逻辑层面加锁 where条件那些
SELECT * FROM sys_users where id = 2
UPDATE sys_users set username = ‘ccc’ WHERE id = 2;

事务满足如下几个特性:
原子性(Atomicity):
一个事务中的所有操作要么全部完成,要么全部不完成。
一致性(Consistency): 事务执行前后数据库的状态保存一致。
隔离性(Isolation) 多个并发事务对数据库进行操作,事务间互不干扰。
持久性(Durability) 事务执行完毕,对数据的修改是永久的,即使系统故障也不会丢失

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值