mysql技术点

mysql 使用like '%A’的形式进行模糊查询,不会使用索引

解决办法:

将数据以倒序的方式存入数据库,再使用liek 'A%'进行查询即可

例如:

将网址url存入数据库,并且使用模糊查询

1.将网址倒序 www.baidu.com -> moc.udiab.www

2.like 'moc.%'
mysql的事务隔离级别

1.读未提交 (read uncommited)

age字段的原始值为7,事务A修改了age字段的值为12,但事务A处于未提交事务状态。
这时事务B在读取age字段值也是12.

事务B读取到了事务A未提交的数据,出现脏读。

2.读已提交 (read commited)

age字段的原始值为7,事务A修改了age字段的值为12,但事务A处于未提交事务状态。
这时事务B在读取age字段值仍然是7.

但是在事务A提交事务后,这时事务B再查询到的值就是12了,极短时间内两次相同的查询,
但是结果却不一样,这种情况是,不可重复读、幻读

3.可重复读 (repeatable read) mysql默认的隔离级别

age字段的原始值为7,事务A修改了age字段的值为12,事务A处于未提交事务状态。
这时事务B在读取age字段值仍然是7.但是事务A提交事务后,这时事务B再一次读取age字段值仍然还是7

这种情况解决了读已提交模式出现的不可重复读、幻读问题

读已提交 (read commited)这种隔离级别,是如何保证每个事务只能读到自己提交的数据的

mysql的每行记录存在一个隐藏列,用于存储最近一次修改这条记录的事务id
这行记录的每一个修改都会保留,以修改时间为顺序进行链式存储(最新修改->上一次修改->…)

事务A进行查询时,mysql会统计当前处于未提交状态的事务有哪些 例:{事务B,事务C,事务D}
将它们排除掉,然后在链式存储中找到最近一次已提交的事务获取它的值

可重复读 (repeatable read)这种隔离级别,是如何保证每个事务只能读到自己提交的数据的

事务A进行查询时,mysql会统计当前处于未提交状态的事务有哪些 例:{事务B,事务C,事务D}。
但是事务A下一次查询时,事务B已经提交了。但是事务A任然以之前的为准,不会更新未提交状态的事务列表,所以每次读取的值是一样的

mysql乐观锁实现:

使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据

1.数据库表设计

 task : 有三个字段,分别是id,value、version

先读task表的数据(实际上这个表只有一条记录),得到version的值为versionValue

每次更新task表中的value字段时,为了防止发生冲突,需要这样操作

   update task set value = newValue,version =  versionValue + 1   
   where version = versionValue;

只有这条语句执行了,才表明本次更新value字段的值成功

mysql实现悲观锁

要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。

我们可以使用命令设置MySQL为非autocommit模式:

set autocommit=0;

设置完autocommit后,我们就可以执行我们的正常业务了。具体如下:

//0.开始事务

begin;/begin work;/start transaction; (三者选一就可以)

//1.查询出商品信息

select status from t_goods where id=1 for update;

//2.根据商品信息生成订单

insert into t_orders (id,goods_id) values (null,1);

//3.修改商品status为2

update t_goods set status=2 where id = 1;

//4.提交事务

commit;/commit work;

执行select status from t_goods where id=1 for update;后。我在另外的事务中如果再次执行select status from t_goods where id=1 for update;则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,但是如果我是在第二个事务中执行select status from t_goods where id=1;则能正常查询出数据,不会受第一个事务的影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值