ToB企服应用市场:ToB评测及商务社交产业平台

标题: 数据库-事件 [打印本页]

作者: 曂沅仴駦    时间: 2024-9-30 20:38
标题: 数据库-事件
1、事件的基础概念

  1. 事务(Transaction),就是将一组SQL语句放在同一批次内去执行,如果一个SQL语句出错,则该批次内的所有SQL都将被取消执行。
复制代码
2、事件的特点

  1. 一个事务中如果有一个数据库操作失败,那么整个事务的所有数据库操作都会失败,数据库数据就会回滚到该事务开始之前的状态。
复制代码
3、事件的限定

  1. MySQL数据库中仅InnoDB和BDB类型的数据库表支持事务。
复制代码
4、事件的ACID原则

  1. 原子性:每一个事务都是不可再分的,在数据库中,整个语句要么执行要么不执行;
  2. 一致性:在执行性=事务前和执行完事务之后数据库中的数据完整性没有被破坏;
  3. 隔离性:事务的执行是互不干扰的,一个事务不可能看到另一个事务运行时操作的数据(通常使用加锁的方式来保证数据库的隔离性);
  4. 持久性:事务执行成功后,该事务对数据库的更改是永久性的,数据变了之后就不会再变,不会被回滚;
  5. 事务的原子性、一致性和持久性由事务的redo 日志和undo 日志来保证。
  6. •REDO LOG 称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。
  7. •UNDO LOG 称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
复制代码
5、实现事件的方法

  1. START TRANSACTION
  2.     开始一个事务,标记事务的起始点;
  3. SET  AUTOCOMMIT
  4.     使用该语句来改变自动提交模式,等于0时关闭自动提交模式,等于1时开启自动提交模式。默认为1,使用事务时为0。
  5. COMMIT
  6.     提交一个事务给数据库。
  7. ROLLBACK
  8.     将事务回滚,数据回到本次事务的初始状态。   
复制代码
6、MySql实现事件的方法

  1. create table bank(
  2.    bid int primary key auto_increment,
  3.    bname varchar(10),
  4.    bmoney decimal(20,2)
  5. );
  6. insert into bank(bname,bmoney) values('杨文琦',5);
  7. insert into bank(bname,bmoney) values('周永康',100000000000000);
  8. select * from bank;
  9. update bank set bmoney = 100000000000000 where bname='周永康';
  10. update bank set bmoney = 5 where bname='杨文琦';
  11. -- 事务的操作
  12. -- 1. 关闭自动提交
  13. set autocommit = 0;
  14. -- 2. 开始事务
  15. start transaction;
  16. -- 3. 一组sql语句
  17. update bank set bmoney = bmoney-1000 where bname='周永康';
  18. update bank set bmoney = bmoney+1000 where bname='杨文齐';
  19. -- 4. 结束事务(判断)
  20.    -- 提交
  21.    commit;
  22.    -- 回滚
  23.    rollback;
  24. -- 5. 开启自动提交
  25. set autocommit = 1;
复制代码
7、数据库中锁的分类

  1. 基于锁的属性分类:
  2.     共享锁(读锁、S锁)、排他锁(写锁,X锁);
  3. 基于锁的粒度分类:
  4.     表锁、行锁(记录锁、间隙锁、临键锁)。
  5. 基于锁的状态分类:
  6.     意向共享锁、意向排它锁。
复制代码
8、事件的隔离级别

事件的并发问题
  1. 在事务并发执行的时候,如果不进行事务隔离,那么就会产生脏写、脏读、不可重复读、幻读的问题。
复制代码
事件的隔离级别
  1. 1. READ_UNCOMMITTED: 读未提交
  2. 2. READ_COMMITTED :读提交(不可重复读)
  3. 3. REPEATABLE_READ :可重复读
  4. 4. SERIALIZABLE :串行化
  5. 每个隔离级别都针对事务并发问题中的一种或几种进行解决,事务级别越高,解决的并发事务问题也就越多,同时也意味着加的锁就越多,所以性能也会越差。
复制代码
事件隔离级别解决的问题
  1. 1、READ_UNCOMMITTED:
  2. 事务读取:不加锁
  3. 事务写入:加写锁
  4. 解决问题:脏写
  5. 存在问题:脏读,不可重复度,幻读
  6. 2,READ_COMMITTED:
  7. 事务读取:加读锁(每次select完成后都会释放读锁)
  8. 事务写入:加写锁
  9. 解决问题:脏写,脏读
  10. 存在问题:不可重复读、幻读
  11. 3、REPEATABLE_READ:
  12. 事务读取:加读锁(每次select完不会释放锁,而是事务结束后才会释放锁,但如果是mysql的innodb就会加间歇锁)
  13. 事务写入:加写锁
  14. 解决问题:脏写,脏读,不可重复读,幻读(如果是mysql的innodb则已经解决)
  15. 存在问题:幻读(如果是mysql的innodb则不存在这个问题)
  16. 4. SERIALIZABLE:
  17. 不管读取还是修改所有的事务都会串行化执行,一个事物的执行必须等到其他事务结束
复制代码









免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4