事务和Oracle锁的概念

事务和Oracle锁的概念

  • 事务的概念
    • 事务的回滚和提交
  • 多用户下的死锁

事务的概念

事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据的存取, 事务的正确执行使得数据库从一种状态转换成另一种状态(简单理解为对数据的一次操作过程就是一个事务)。

对数据库的一次操作就是一个事务,在一个事务中可能要执行多条sql语句。

事务的回滚和提交

在进行数据操作的过程中可能会在一次功能实现中执行多个更新语句(增加、修改、删除)。比如转账过程:

A转账1000W给B
1.在A账户上较少了1000W(要执行一个减少A账户存款的sql语句)。
2.在B账户上增加1000W(手续费不算,要执行一个增加B账户的sql语句)。
在以上的过程中会出现这样的情况,在减少A账户的存款之后,此时系统出现了一个未知的错误,导致了B账户上的金额没有增加。

此时有一种解决方案:只有所有的sql语句都成功执行之后才进行事务的提交(数据库中使用的命令是COMMIT),若在执行的过程中只要有一条sql语句出现了错误或者异常则让事务回滚(撤销已经执行成功的sql语句,数据库中事务回滚的命令是ROLLBACK)。

  • ROLLBACK:事务回滚(如果中途出现了异常则可以使用该使命回滚)。
  • COMMIT:事务提交(中途没有出现任何问题则提交),提交之后的数据不能再回滚。

多用户下的死锁

在多个用户同时操作一条数据的时候,如果前面一个用户更新了数据,但是没有提交事务(更新数据之后没有执行COMMIT命令提交事务)。则后面一个用户不能操作当前数据,只有等待上一个用户提交或者回滚事务之后才能进行操作。

在数据库中如果某个用户正在更新一条数据的时候会取得一把锁,这个锁是当前用户占用,当前用户操作该数据的过程中其他用户不能操作该数据,在操作完成之后会释放锁(为该条数据释放锁),释放锁之后其他用户才能进行操作,这是一种悲观锁(认为数据一定会出现问题,所以就要锁定),也是独占锁(与共享锁是相对的)。

数据操作完毕的两种情况:提交事务、事务回滚。

当多个用户操作同一条数据的时候,只有上一个用户提交或者回滚了事务之后下一个用户才能进行操作,否则下一个用户处于线程阻塞状态。因为在进行更新数据的时候会为数据库上锁,这里是行锁。

如果想要查询语句也能出现死锁的现象,可以在查询语句之后增加一个关键字 FOR UPDATE

其实上数据库提供的提供的锁机制是一种悲观锁,此处有乐观锁,乐观锁是通过控制版本号或者时间戳来实现的一种机制,要结合程序才能实现。

悲观锁与乐观锁的区别在于悲观锁认为数据更新时一定会发生冲突,因此需要对纪录枷锁,具有较好的性能,通常针对并发使用。

乐观锁与其不同,它认为不存在冲突,因此,需要在提交时保证数据一致性,如果不一致,则返回错误,由程序本身的逻辑进行处理(通过在表中增加版本戳列,来表示是否发生了变化)。

你可能感兴趣的:(数据库)