一. 事务定义和基础
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脚本
画: 包括 一对一, 一对多, 多对多.



