MySQL InnoDB中使用悲观锁
要使用悲观锁,我们必须关闭mysql数据库的自动提交属性,因为MySQL默认使用autocommit模式,也就是说,当你执行一个更新操作后,MySQL会立刻将结果进行提交。set autocommit=0;
//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;
//4.提交事务
commit;/commit work;
使用
select…for update
会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引
是不会使用行级锁的,会使用表级锁把整张表锁住,这点需要注意。
乐观锁
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。
相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本。
更改查询
Mysql当使用 update select操作,从数据库中先查询出数据再更改数据,会提示报错信息:
You can't specify target table ...
主要是因为mysql不支持,需要再增加一个select作为查询出的镜像结果再进行更改操作。
查一张表的结果去更改另一张表
update table1 inner join select table2 set 操作:
语法
UPDATE table_1 a INNER JOIN (SELECT id, name FROM table_2) b
ON a.id = b.id SET a.name = b.name
Mybatis中#{}和${}的区别
前者会将传入的字符串加上引号再装配sql语句,后者则是直接使用传入的字符串,在传入表名的时候使用后者。前者可以防止sql注入。
网友评论