一. 事务定义和基础
1. 事务:事务是一条 或 多条sql语句, 这些sql要么都执行要么都不执行
? ?例:转账:? ?? ??? ?张三 ?给 李四 ?转账 1000元?,这时数据库应该的操作? ?? ??? ? update account set balance = balance - 1000? ? ? ? ? ? ? ? ? ? ? ?where name = '张三'; ?? ??? ? update account set balance = balance + 1000 ? ? ? ? ? ? ? ? ? ? ?where name = '李四'; ? ? ??这两条sql语句要么都执行要么都不执行,不然实现不了这个操作。
? ?注意:(1)mysql数据库的事务 是自动提交 ,? oracle数据库是手动提交
? ? ? ? ? ? ? (2)show variables like 'autocommit';? 显示提交方式。?
? ? ? ? ? ? ? (3)在正式开发中事务必须改成手动提交
2.事务的sql语句:?
? ? ? ?(1)begin; ? ? ? ? ? ? ? ? start transaction;开启一个事务 ? ? ? ?(2)set autocommit = 0; 设置手动提交 ? ? ? ?(3)savepoint a; 设置保存点 ? ? ? ?(4)commit;执行 ? ? ? ?(5)rollback to a;回滚至保护点a
? ? 注意:手动提交的好处:手动提交更灵活,可以控制回滚和提交,保证了数据的安? ? ? ? ? ? ? ? 全和程序的灵活。
二.事务的特性
? ? ? 1.原子性: ?? ? ?? ??? ??? ?事务是最小的执行单位,不可在分, ?? ??? ??? ?事务由一条 或多条sql语句组成一个完整的事务 ?? ??? ??? ?这些sql语句组成后不可以拆分; ?? ??? ??? ?那么这个事务也不可在分 ?? ??? ??? ? ?? ??? ?2.一致性: ?? ? ?? ??? ??? ?|-- 事务中包含的sql语句在修改之前 和修改之后的状态要一致 ?? ??? ??? ? ? ? ? ? ? ? ||-- 两个表上:? ?? ??? ??? ???体现在持久外键的表上,和主表的关系; ? ? ? ? ? ? ? 如果主表的主键值修改了,那么从表的外键字段值要跟主表的主键值保持一致;
? ? ? ?3.持久性: ?? ??? ??? ? 如果一个事务 执行了 commit操作 ?? ??? ??? ? 那么它对数据库的影响永久有效,不可回滚; ?? ??? ? ?? ??? ?4.隔离性: ?互斥的 ?? ??? ??? ?指的是并发情况下的事务, ?? ??? ??? ?事务和事务之间在执行时 相互不干扰, ?? ??? ??? ?具有互斥性;
三.MySQL中的四个隔离级别:
? ? ?1.读未提交数据 ?read uncommited? ? ? ?2.读已提交数据 ?read commited? ?oracle默认的 ? ? ?3.可重复读 repeatable read? ?mysql默认的 ? ? ?4.串行化 serialize
假设数据库的事务不具备 隔离性,那么就会出现事务并发问题 :
1.脏读 ?? ??? ? 现在有 T1事务 , T2事务 两个事务,?假设T1修改了一条记录, 没提交 ,这时T2读取了这条记录,?这时T1 遇到问题,没有执行,回滚了,这时T2 读取到的数据9000,和数据库表中的数据 不一致,那T2读到的数据就是脏数据 ? ? ?例: ?? ??? ?假设当前余额为10000,张三修改了余额改成了 9000 ?, 没提交,这时李四 读取了这条记录 为 9000 ,?这时张三遇到问题,回滚了,余额为10000 ,那么李四读到的数据是 9000 , 和数据库中数据不一致,那么李四读到的数据就是脏数据。
2.不可重复读?
? ? ? ? 体现的是update操作,?commit就是事务的终结,即 执行 ?? ??? ?假设有两个事务 T1 , T2 ,假设T1 一直 读取了 一条记录,没提交 ,没读完但是在T1读取 这条记录时,T2事务进来了,修改了记录并提交了,那么T1在多次读取数据结果时不一致,那么就是不可重复读
?3.幻读? ( insert into , delete语句)? ?? ??? ? 两个事务T1 ,T2,?T1读取了当前表的总记录数10条记录; ?没提交,?这时T2 insert into (或者delete)记录 ?T1 又读取一边发现总记录变成11条记录了,T1两次读取的总记录数一直吗? 不一致,那么就是幻读
隔离级别的作用是用来解决 事务的并发问题:
查看mysql默认的隔离级别:? select @@tx_isolation;? ?运行结果:repeatable -read
修改mysql的隔离级别为:读未提交数据 ? ? ? ? ? ? ? ? ?set session transaction isolation level read uncommitted; ?
(1)如果mysql中的隔离级别是读未提交数据数据?就会出现 脏读,不可重复读 ,幻读 ?? ?? (2)如果mysql中的隔离级别是 读已提交数据,会解决脏读,但是会出现不可重复读 ?和幻读 ?? ?? (3)如果mysql的隔离级别是 可重复读,可以解决 脏读,不可重复读, 会出现幻读 ?? ? (4)如果mysql的隔离级别是 串行化 ,可以解决 脏读, 不可重复读, 幻读
数据库中 处理事务并发问题的方式有几种:? ?? ? ?1.默认是通过隔离级别来解决 ?? ? ?2.通过锁的方式: ? ? ? ? ?(1)悲观锁: select * from ?xxx for update;
? ? ? ? ? ? ? ?悲观锁: ? ? ? ? ? ? ? ? ? ? 共享锁: 读锁 select ?,一个门多个钥匙开 ? ? ? ? ? ? ? ? ? ? 排他锁: 写锁 insert into ,delete ,update?一个门,一个钥匙。 ? ? ? ? ?(2)乐观锁: 没有锁的概念 使用版本号 和 时间戳来判断
四.PowerDesigner: 建模工具
? ? ? ? 1.E-R : Entity 实体 public class Person? ?? ??? ? ?Relationship ?关系,可以画实体关系图 , 属于概念图?? ?Conceptual ? ? ? ? 2.物理数据图: 针对数据库表关系的图 ,就是Navicat中的图 ? ? ? ?
? ? ? ? 两种方式:?使用Navcat 画图,导出sql脚本; ? ? ? ? ? ? ? ? ? ? ? ? ? ?使用PowerDesigner软件,画物理图,生成sql脚本
? ? ? ??画: 包括 一对一,?一对多,?多对多.
|