27.数据库事务管理

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

操作

打开数据库
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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值