Mysql数据库总结-基础篇-事务

  1. 事务简介
    事务是一组操作的集合,这组操作要么全部执行成功,要么全部执行失败。

  2. 事务操作
    start transction 开启事务;
    commit 提交事务;
    rollbace 回滚事务;

  3. 事务的四大特征
    原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
    一致性(consistency):事务完成时,必须所有的数据都保持一致。(账户 转账;火车票 买票)
    隔离性(isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作的独立环境下运行。(类似并发特性)
    持久性(durability):事务一旦提交或者回滚,对数据库中数据的改变都是永久性的。

  4. 并发事务问题
    脏读:一个事务读到了另一个事务没有提交的数据。
    不可重复读:一个事务前后两次读取同一条数据,两次读到的数据不同。
    幻读:一个事务按条件查询数据时,提示不存在。插入数据时,提示数据已经存在,好像出现了“幻影”。

  5. 事务隔离级别
    read uncommit: 脏读 不可重复读 幻读 问题都会存在。
    read commit: 解决脏读问题。
    repeatable read(mysql 默认):解决脏读和不可重复读问题。
    serialize : 解决脏读、不可重复读、幻读问题

  6. 事务隔离级别演示
    查看数据库的隔离级别:select @@transaction_isolation;
    设置数据库的隔离级别:set [session | global] transction isolation level [read uncommit | read commit | repeatable read | serialize ]

    第一个实验:
    set session transaction isolation level read uncommit;
    start transaction; 事务A start transaction; 事务B
    select * from pc;
    update pc set price = 7777 where model = “1001”;【此时没有提交事务】
    select * from pc; [读到了事务B没有提交的数据,即出现脏读问题]

    第二个实验
    set session transaction isolation level read commit;
    start transaction; 事务A start transaction; 事务B
    select * from pc;
    update pc set price = 7777 where model = “1001”;
    select * from pc; [读不到了事务B没有提交的数据,解决了脏读问题]

start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;
commit;
select * from pc; [读到的数据和之前读取的不同,即出现不可重复读问题]

第三个实验

set session transaction isolation level repeatable read;
start transaction; 事务A start transaction; 事务B
select * from pc;
update pc set price = 7777 where model = “1001”;
commit;
select * from pc; [读到的数据和之前读取的相同,解决了不可重复读问题]
commit;
select * from pc; 【提交之后,在去读取,就能看到事务B修改的数据了】

start transaction; 事务A start transaction; 事务B
select * from pc where model = “1001”;[提示不存在]
insert into pc(model,ram,price) values = (“1001”,166,2000 );【插入成功】
commit;
insert into pc(model,ram,price) values = (“1001”,166,2000 );[提示已存在]
select * from pc where model = “1001”;[提示不存在,即存在幻读问题]

第四个实验
set session transaction isolation level serializable;
start transaction; 事务A start transaction; 事务B
select * from pc where model = “1001”;[提示不存在]
insert into pc(model,ram,price) values = (“1001”,166,2000 );【提示不能执行】

insert into pc(model,ram,price) values = (“1001”,166,2000 );【插入成功】
select * from pc where model = “1001”;【可以查到,解决了幻读问题】
commit;
【此时上面insert语句可以执行,但是提示插入失败】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值