数据库事务管理

Mysql数据库
设计: 表设计成功
alter table 改表的主键,改约束关系 
表:关系表,改一个表,另外一个表
表----java 代码
增删改查(项目中需要的操作)
项目:
Create database
Create table(从测试环境到生产环境,导入)
Database数据库,或者table表,在测试环境测试成功,在生产环境去使用。
数据库(设计是基本)
查询语句全称 
Select  字段名称 from 表 where 条件 group by 被字段分组 order by 排序 limit 限制记录条件   
 限定条件的查询 where  (and or)
分组: group by
排序 order by
分页:  limit
操作
(1)    打开数据库
Use 数据库
(2)显示数据库中所有的表
Show tables;
(3)条件: where
语言上:同一字段用”和”,还是或 or
(4)分组后只能使用统计函数(聚合,平均数avg, 和sum, count个数,max最大值,min最小值) 
分组后分组字段是可以显示的
统计重名的人有多少个
Group by 条件需要加having,
Groupby分组后加条件
select username,count(*)  mycount from user group by username  having mycount>1;
注意:
Count(*)后面的名称是别名,意义在于让count函数只计算一次
后面的条件可以引用mycount
别名取java的关键字
订单列表: list    --Java  List(尽量不要用java 的关键字做别名变量)
尽量少用a,b,c
在长语句中,可读性差
分组:把相同数据放在一起,低版本的mysql只能结合放在一起的标准字段和聚合函数进行显示。
Order  by 数值排序
项目select查询功能
银行转帐
Update 张三的帐户 -50
Update 李四的帐户 +50
断网,没电,异常
项目中常常是多个sql语句的结合,mysql是一句一执行。 
凡是数据库,如何保证数据的安全,概念:事务
事务:操作不进行表操作,只是把这个表放在内存中,对内存进行操作,如果确认操作,提交事务,自动把内存数据同步更新到表中,如果断电,断网,没电,异常,事务有作用,遇到异常可以回滚,把之前内存的操作回滚恢复,表状态回复到事务开始前。 
银行: 借方(存)   贷方(取)
       1000        9000
银行帐每天备份,把今天帐重新做好(回滚)
加入事务,就可以做事务回滚
Mysql 中有很多变量 autocommit 自动提交,设置为false,相当于开启事务,不操作表
并发线程一定是两个事务之间. 

增(格式,不做批增)删(批删)改查
并发的事
增发生并发(两个线程都有事务,只有提交出现问题)
开启事务,提交事务 commit,回滚事务rollback,这里的回滚和提交有助于保护数据安全,一旦计算机异常,可以回滚保护数据安全。
线程: 就绪 运行 阻塞  死亡
尽量避免线程阻塞 
重要问题:mysql表(行锁,表锁)
Insert into 是悲观锁,只锁当前的id行,默认行锁.
解决insert into悲观锁,也就解决了并发。  
Insert into插入数据时,表中主键一定要自增,插入时不要带id。表设计定义id成主键自增,primary key auto_increment
Insert into 做到内存和表都是行锁,如果出现出锁,并发出现某个用户使用程序死机。
Insert into 表名(字段)values() 
Values中一定没有id的内容,行锁就阻塞. 
删除,两个线程两个事务同时执行删除.
Delete from user where id=1;
 Delete 是一个行锁。另外一个线程就会锁。
数据库的删除是假删除,第一不能解决id不连续,第二不能解决线程阻塞。数据库删除就变成更新的问题。
数据只要删除,任何一个线程删除,但是,某些线程阻塞,改变不了删除的条件。
更新
Update
两个线程同时更新同一条记录
Update默认行锁
另外一个线程就阻塞
打破update行锁,(默认悲观锁)
思想:乐观锁
程序执行没有问题,不用锁,这条语句可以执行.update底层自动带行锁.最精典的乐观锁 CAS机制
内存中值:数据新值, 修改数据赋予一个新值,数据库的值旧值, 发出修改操作,把内存和数据库的值做对比,一致,允许修改,不一致就不允许修改.
在数据库中加上一个字段version(版本)
默认version=1, version做计算,整型,每次修改操作完成后让版本加1,事务先把数据在内存中,提交时再同步到表里.
现在对表加上一个字段version
修改表,加上一个字段 add column
alter table user add column version int default 1;
每次更新数据时,查找带上version的版本,同时update修改把数据库的version版本再增加1
   
在事务的sql语句中,修改数据加上一个字段的比较version,只有version版本和修改条件一致允许修改,修改时除了修改给定的值,还要把version版本提高一个版本.
update user set username="赵六",version=version+1 where id=2 and version=1;wk 
保证了数据的安全.
增删改操作---融合在项目中审核机制
论坛-审核, 关键操作审核机制
如果审核机制,当前数据表审核字段, 加上审核,有一个审核期限,审核不通过,不允许注册.
alter table user add column mycheck int default 1;
用户名:
增加
Is_delete 删除的判断标志
Version 乐观锁解决update更新的问题
addCheck对用户注册的用户名进行审核.
还有几个点
Insert into ,update,delete默认都是行锁
Select默认没有行锁,表锁.
Select加行锁
如果两个事务加上目的性for update,就会出现线程阻塞.
 Insert into解决并发锁的问题
限定id, id做主键,同时auto_increment
删除实际是假性删除
Update只要commit,基本造成阻塞,用乐观锁,version
项目过程中:表述,错误码
并行过程中的增删改查
批量
批量增加:一次性增加若干数据,2条数据或者3条数据 
insert into user(username,sex,position,age,password,is_delete) values("赵五","男","杭州",20,"123456",0), ("赵五","男","杭州",20,"123456",0),("赵五","男","杭州",20,"123456",0); 
批量删除
Delete from user where id=1 or id=2 or id=3
缩短,在where 后面用一个in,把选择的数据放在集合中. 
Delete from user where id in (1,2,3);
批量更新(条件更新) where选出的数据是一堆。
Update user set age=age+1 where age>1;

你可能感兴趣的:(数据库,oracle)