SQL 之 事务、隔离级别与死锁

1 什么是事务

答:事务是作为单个工作单元而执行的一系列操作(同一条船上的,有一条语句有病,整条船都得翻)

定义事务是这样滴:

eg:begin tran;

       insert into mydb.table(id,name,age) values(1,'echo',18);

       insert into mydb.table(id,name,age) values(2,'mumu',15);

     commit tran;--提交事务,或者撤销事务  rollback tran

2 事务的四个属性是啥

答:原子性(要么全部执行,要么全部不执行)、一致性(同时发生的事务在修改和查询时不发生冲突)、隔离性(控制数据访问机制)、持久性(修改总是会先写到事务日志中,据此可进行恢复)


3 隔离级别

答:隔离级别用于决定如何控制并发用户读写数据的操作,设有6个级别。read uncommited(未读提交)、read committed(已读提交 默认设置)、repeatable read(可重复读)、

serializable(可序列化)、snapshot(快照)和read commited snapshot(已经提交读隔离)

     read uncommited(未读提交)就是传说中的脏读,读操作不请求共享锁,这就意味偷窥呀,持有排他锁的写操作也拿它没办法,因为它根本就没有锁呀咋排啊,所以它可以看到别人干了啥,不会妨碍他人干啥,也不会和他人发生冲突,于是它不能重复读、会丢失更新、会产生幻读

     read committed(已读提交 ) 需要共享锁,所以读写会发生冲突。读操作完成就会释放共享锁,下次再读可能就不一样了(有人暗中动了手脚),所以是不可重复读、会丢失更新、会产生幻读

     repeatable read(可重复读) 不但需要共享锁,共享锁将一直保持到事务完成为止(小家伙你再敢动!你有权限吗?哈哈)可重复读、不会丢失更新、会产生幻读

     serializable(可序列化)  repeatable read只锁定查询第一次运行时找到的数据资源,查询结果范围之外的没有被锁定,其他事务要是在第二次读取之前插入新行,并且新行满足查询条件,好恐怖,幻影(phantom)出来了,真是万万没想到啊~~serializable专业治鬼100年,serializable:其实我就些微升级了下,我保护的多呀,哈哈(不仅锁定满足查询条件的那些行,还锁定未来可能满足查询条件的行)可重复读、不会丢失更新、不会产生幻读

     snapshot(快照)  和 serializable 类似,但是人家不需要共享锁哦,因为人家用的是行版本控制技术。(事务启动前最后提交的版本保存在tempdb数据库中,更新和删除性能会被影响但是读操作性能提高)。snapshot隔离级别要在数据库上设置开关。通过检查保存的行版本,可以检测出更新冲突(唯一检测更新冲突的隔离级别),快照事务终止。

     read commited snapshot(已经提交读隔离) 和 read committed类似,读操作读取的数据行是语句启动前最后提交的版本,不可重复读、会丢失更新、会产生幻读

4 死锁

  进程之间 相互 永久 阻塞

5 死锁咋办

   SQL会终止优先级别低的,同等优先级则牺牲操作少的事务,因为其回滚开销少

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值