数据库关于事务的一些笔记

事务

事务的概念:事务是指逻辑上的一系列操作, 组成这个操作的所有单元,要不一起成功,要不就是一起失败。

  1. Mysql中的事务
    mysql中的事务自动提交,一个sql语句就是一个事务。
    start transaction 开启事务
    rollback 回滚事务
    commit 提交事务:事务提交后,不能恢复
    (注)
    1.commit操作就是用较高效率的方式将事务操作记录到磁盘上,然后数据库在达到最有效条件的时候调用DBRW(DBWR是数据库写进程)将数据写入数据文件,期间不影响数据的一致性。
    2.commit会触发lgwr进程,此进程会将redo log buffer 里的与commit的事务相关的redo record写入log file。
    关闭自动提交事务:set autocommit = off/ set autocommit = 0;

  2. oracle中的事务
    oracle中的事务默认是不自动提交的,需要在执行sql语句之后敲commit提交。

事务的特性 (ACID)

  1. 原子性
    指的是事务是一个不可拆分的整体,要么事务中所有的操作都发生,要么都不发生。
  2. 一致性
    事务前后的数据完整性必须保持一致。(这里可能有点疑问)
    举个例子。当前的你账户上面有500,你去买一个300的东西(事务1),但是在事务执行的过程中,还没执行完,你又买了一个400的东西(事务2)。这就会导致两个事务操作的状态是不一致的。本来-400这个应该是在500-300后的200这个状态上面的,但是变成了500上面操作。由一开始的500,变成两个状态,200和100。违反了一致性,一致性就是只能从500变成100或者200就好。
  3. 隔离性
    事务的隔离性就是多个用户同时访问数据的时候,一个用户的事务不能被其他用户的事务干扰,多个并发事务之间数据需要相互隔离。隔离性可以避免产生“脏读”。
  4. 持久性
    持久性是指事务一旦被提交,就会永久的改变数据库的数据。

事务隔离级别

事务如果不考虑隔离性,则会产生下列问题

  • 脏读
    指一个用户读取到的数据正在被另一个用户操作。当另一个用户执行回滚操作的时候,前一个用户读取的数据发生变化。
  • 不可重复读
    在一个事务先后两次读取的数据情况不一样,第二次读取到另一个事务以及提交数据(强调数据记录变化 update )
  • 虚读或幻读:在一个事务中,第二次读取发生数据记录数的不同 ,读取到另一个事务已经提交数据 (强调数据记录变化 insert )

可以使用序列化来避免这些问题。
Serializable:序列化就是将对象序列化成一个可传输,存储的介质。也就是说保存内存中的对象,存到临时存储区或持久性存储区。(感觉相当于提交事务)
这里写链接内容

事务的丢失更新问题

多个事务同时更新,会产生覆盖。丢失更新的数据。

解决:

悲观锁:select * from table lock in share mode(读锁,共享锁)
select * from table for update (写锁,排他锁)

mysql数据库内部提供两种常用 锁机制:共享锁(读锁)和排它锁(写锁)
允许一张数据表中数据记录,添加多个共享锁,添加共享锁记录,对于其他事务可读不可写的
一张数据表中数据记录,只能添加一个排它锁,在添加排它锁的数据 不能再添加其他共享锁和排它锁的 ,
对于其他事物可读不可写的

乐观锁:
采用记录的版本字段,来判断记录是否修改过 ————– timestamp
timestamp 可以自动更新
create table product (
id int,
name varchar(20),
updatetime timestamp
);

每次修改都会判断更新时间是否与之前的一样,一样则更新,不一样则事务提交失败

猜你喜欢

转载自blog.csdn.net/Vi_sener/article/details/82424101