- 事务
事务是一条或多条sql语句组成的 ,这些sql语句要么都执行,要么都不执行。针对所有数据库,关系型数据库和非关系型数据库。 - 涉及到的语法:
1.show variables like 'autocommit’查询是否自动提交
2.set autocommit = 0; 设置为手动提交(提交的意思是永久保存)
3.select global|session transaction ioslation level read uncommitted|read commited|repeatable read|serializion设置隔离级别
4.select @@tx_isolation 查看隔离级别
5.rollback 回滚
6.savepoint 保存点,如果回到最初的保存点,其中间的所有子保存点则取消。 - 特点
原子性:一个事务是最小执行单位,不可在分成多个部分,也就是说事务在执行时,不可以过半终止。所以说要么不执行,要么都执行。
一致性:事务开始到任务结束,数据的状态要保持一致。
1.当前表中有两条数据,这两条数据在一个事务中,那么这两条数据的状态要一致
2.主表和从表,假设主表的主键更新了,那你从表的外键字段也必须更新
隔离性:体现在并发情况下的,一个事务操作一条数据时其他事务不可以访问这条记录,没有隔离级别的话,在并发情况下读取数据时就会出项一下情况:
1.脏读:假设T1和T2两个事务,此时T1修改了数据库表中的一条数据但是没提交,然后T2读取了当前修改后的记录,这时T1回滚了,这是T2读取的数据和数据库表中的数据不一致。
2.不可重复读:假设T1和T2两个事务,T1不断的读取当前表中的某条记录,在读取过程中T2对当前记录进行了修改操作,并且提交了。这时候T1在一个事务中读取的数据不一致了。
3.幻读:T1和T2两个事务,当T1查询工资为5000的员工数是10,T2inner into操作,总记录数为11,T1和T2总记录数不一致,就是幻读
持久性:如果事务执行commit提交操作,那么多数据库永久保存,不可回滚 - 隔离级别
1.读未提交数据(read uncommitted):会出现脏读、不可重复度、幻读
2.读已提交数据(read committed):会出现不可重复读、幻读 Oracle默认
3.可重复读(repeatable read):幻读 MySQL默认
4.串行化(serialization):都不会出现,但是性能比较慢 - 解决并发问题
1.事务隔离级别
2.悲观锁
关键字:for update
演示悲观锁时要修改隔离级别,设置手动提交数据。只可以在查询后边带有关键字。
5.5版本之前myISAM表锁, myISAM 不支持事务
现在 INNODB行锁、表锁,INNODB 支持事务
3.乐观锁:版本号和时间戳来判断是否出现并发问题。可以理解为在表上加一个字段。
在并发情况下,没有事务隔离级别时候T1和T2两个事件去查询修改时,T1进入锁的时候标记时间戳为,执行完毕后,标记的时间戳是否和刚进入时的时间是否相等,如果相等意味着T2事件没有修改,将最后的时间定为现在的时间戳。下次在以该时间戳做标记。如果时间戳不和刚刚标记的时间戳相等,意味着在你保存之前T2修改过(如果T1在保存,数据库就乱了),直接放弃之前所有操作重新开始。这样可以让其不同时修改,只能一个一个修改。
笔记04-数据库事务、锁
最新推荐文章于 2024-10-05 14:16:38 发布