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会终止优先级别低的,同等优先级则牺牲操作少的事务,因为其回滚开销少