mysql事务

  1. 事务可以理解为一件事,组成这件事可能有多个步骤,要求这些步骤要么都成功,要么都不成功,事务可以保证数据的完整性。
  2. mysql中事务操作
-- 方式1
-- 开启事务
start transaction
-- 事务回滚
rollback
-- 提交事务
commit
-- 方式2
-- 查看当期那autocommit值,默认on代表自动事务,执行任意一条sql语句都会自动提交事务
show variables like '%commit%' 
-- 关闭自动事务,必须手动提交事务
set autocommit = off
  1. 事务特性包括原子性、一致性、隔离性和持久性(ACID)。原子性是指事务是一个不可分割的单元,事务操作要么都成功,要么都不成功。一致性是指事务前后数据的完整性必须保持一致。隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务干扰。持久性是指事务一旦被提交,对数据库中数据的改变就是永久性的。

  2. 脏读是一个事务读取到另一个事务的提交数据,不可重复读是指两次读取的数据是不一致的,幻读是指当事务不是独立执行时发生的一种现象。Serializable可以避免脏读、不可重复读和幻读,Repeatable Read可以避免脏读、不可重复读,Read Committed可以避免脏读情况,Read Uncommitted以上情况都不能避免。mysql默认事务隔离级别是可重复读,而oracle默认的隔离级别是读已提交。

-- 查看事务隔离级别
select @@tx_isolation;
-- 设置事务隔离级别
set session transaction isolation level Serializable;
脏读:一个事务读取到另一个事务的为提交数据
设置A,B事务隔离级别为Read uncommitted			
set session transaction isolation level  read uncommitted;
在A事务中:
start transaction;
update account set money=money-500 where name='aaa';
update account set money=money+500 where name='bbb';
在B事务中:
start transaction;
select * from account;
这时,B事务读取时,会发现,钱已经汇完。那么就出现了脏读。
当A事务提交前,执行rollback,在commit, B事务在查询,就会发现,钱恢复成原样	
也出现了两次查询结果不一致问题,出现了不可重复读。

解决脏读问题将事务的隔离级别设置为read committed来解决脏读
设置A,B事务隔离级别为Read committed
set session transaction isolation level  read committed;
在A事务中
start transaction;
update account set money=money-500 where name='aaa';
update account set money=money+500 where name='bbb';
在B事务中
start transaction;
select * from account;
这时B事务中,读取信息时,是不能读到A事务未提交的数据的,也就解决了脏读。
让A事务,提交数据 commit;	
这时,在查询,这次结果与上一次查询结果又不一样了,还存在不可重复读。
				
解决不可重复读将事务的隔离级别设置为Repeatable read来解决不可重复读。
设置A,B事务隔离级别为Repeatable read;
set session transaction isolation level  Repeatable read;
在A事务中
start transaction;
update account set money=money-500 where name='aaa';
update account set money=money+500 where name='bbb';
在B事务中
start transaction;
select * from account;	
当A事务提交后commit;B事务在查询,与上次查询结果一致,解决了不可重复读。
				
设置事务隔离级别Serializable,它可以解决所有问题
set session transaction isolation level Serializable;
如果设置成这种隔离级别,那么会出现锁表。也就是说,一个事务在对表进行操作时,
其它事务操作不了。
  1. 丢失更新是多个事务对同一记录进行了操作,后提交的事务将先提交的事务操作覆盖了。解决丢失更新问题可以采用悲观锁或乐观锁。悲观锁是假设丢失更新一定会发生,利用数据库内部锁机制管理事务。update语句默认添加排他锁。乐观锁假设更新不会发生,在程序中添加版本字段解决丢失更新问题。
-- 共享锁,读锁
select * from tab_name lock in share mode;
-- 排他锁,写锁
select * from tab_name for update;
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快乐江小鱼

知识创造财富,余额还是小数

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

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

打赏作者

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

抵扣说明:

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

余额充值