Oracle-数据库事务和锁

一、事务

事务:操作数据库的一系列操作的组合,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位,事务由事务开始和事务结束之间执行的全部数据库操作组成
1.一条sql语句,执行的时候要么成功,要么失败
2.多条sql语句当作一个整体执行,要么成功,要么都失败,不可分割的逻辑单元;
事务分为显示事务和隐式事务

事务具有ACID特性
Atomicity(原子性):要么都成功 要么都失败

Consistency(一致性):事务执行完,数据都是正确

Isolation(隔离性): 两个事务同时操作一张表,B事务要么是在A事务前完成,要么在A事务完成后执行(锁表) (同一Session)

Durability (持久性):数据提交后 就固化下来

二、锁

1.没有锁

1.修改失败
2.不可重复读
3.脏读/幻读

2.锁的意义

1.避免以上情况
2.解决并发问题

3.锁的问题

死锁

4.锁的分类

4.1 乐观锁 --不使用数据库锁机制,通过程序设计角度来谈
1.认为没有并发,读取数据—修改—保存(没有锁),通过数据判断

2.更新的时候做一个判断-----需要一个判断维度(时间戳–Timestamp—long数字),就判断这个时间戳

先查询–再更新,查询出来以后,得到时间戳,在更新的时候,加个1(规则统一),判断加1 之后的数据是否大于之前的时间戳,大于则正常更新,否则这个数据被修改过,那就不能操作-----失败了;

3.Version/跟时间戳套路一样 -----时间戳建议大家使用long----bigint

4.规则需要统一,所以其实还有漏洞;
高性能;
4.2 悲观锁:基于数据库锁机制完成
会影响性能;
1.认为任何时候都可能多线程并发,认为我们在操作某一条数据的时候,刚好别人在操作;

2.共享锁 S锁 读锁,允许别的事务来读,但是不允许修改;读完就释放,锁定数据页;(除非holdlock就一直锁定)

3.排他锁 X锁 写锁,准备写数据,不允许其他事务进行读也不允许写;—Insert

4.更新锁 U锁 先查询再更新----update

5.行锁 where id=123

6.表锁 where 1
锁定提示 描述
HOLDLOCK 将共享锁保留到事务完成,而不是在相应的表、行或数据页不再需要时就立即释放锁。HOLDLOCK 等同于 SERIALIZABLE。
NOLOCK 不要发出共享锁,并且不要提供排它锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。有可能发生脏读。仅应用于SELECT语句。
PAGLOCK 在通常使用单个表锁的地方采用页锁。
READCOMMITTED 用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
READPAST 跳过锁定行。此选项导致事务跳过由其它事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,使其等待其它事务释放在这些行上的锁。READPAST 锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级锁之后读取。仅适用于 SELECT 语句。
READUNCOMMITTED 等同于 NOLOCK。
REPEATABLEREAD 用与运行在可重复读隔离级别的事务相同的锁语义执行扫描。
ROWLOCK 使用行级锁,而不使用粒度更粗的页级锁和表级锁。 (SELECT,UPDATE和DELETE)
SERIALIZABLE 用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。 TABLOCK 使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,SQL Server 一直持有该锁。但是,如果同时指定 HOLDLOCK,那么在事务结束之前,锁将被一直持有。
TABLOCKX 使用表的排它锁。该锁可以防止其它事务读取或更新表,并在语句或事务结束前一直持有。 UPDLOCK 读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。UPDLOCK

5.如何避免死锁

死锁其实完全避免不可能;更多的是降低死锁的概率

1.不用锁就不会死锁,建议大家使用乐观锁—高性能

2.统一操作顺序–先A后B再C。。。。在系统中所有的操作都需要统一顺序

3.最小单元锁,锁里面操作尽量减少操作

4.避免事务中等待用户输入,避免在事务中等待时间过久

5.减少数据库并发----微服务

6.分库分表表分区:

7.降低事务级别(遗留项)

8.设置死锁时间 set lock_timeout(锁超时时间)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值