设置完autocommit后,我们就可以执行我们的正常业务了 。具体如下:
上面的begin/commit为事务的开始和结束 , 因为在前一步我们关闭了mysql的autocommit , 所以需要手动控制事务的提交 。
上面的第一步我们执行了一次查询操作:select status from t_items where id=1 for update;与普通查询不一样的是,我们使用了select…for update的方式 , 这样就通过数据库实现了悲观锁 。此时在t_items表中 , id为1的那条数据就被我们锁定了,其它的事务必须等本次事务提交之后才能执行 。这样我们可以保证当前的数据不会被其它事务修改 。需要注意的是,在事务中,只有SELECT ... FOR UPDATE或LOCK IN SHARE MODE操作同一个数据时才会等待其它事务结束后才执行 , 一般SELECT ...则不受此影响 。拿上面的实例来说,当我执行select status from t_items where id=1 for update;后 。我在另外的事务中如果再次执行select status from t_items where id=1 for update;则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,但是如果我是在第二个事务中执行select status from t_items where id=1;则能正常查询出数据,不会受第一个事务的影响 。
使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主键或者索引,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住) 。举例如下:
1、select * from t_items where id=1 for update;
这条语句明确指定主键(id=1),并且有此数据(id=1的数据存在) , 则采用row lock 。只锁定当前这条数据 。
2、select * from t_items where id=3 for update;
这条语句明确指定主键,但是却查无此数据,此时不会产生lock(没有元数据,又去lock谁呢?) 。
3、select * from t_items where name='手机' for update;
这条语句没有指定数据的主键,那么此时产生table lock,即在当前事务提交前整张数据表的所有字段将无法被查询 。
4、select * from t_items where id0 for update;或者select * from t_items where id1 for update;(注:在SQL中表示不等于)
上述两条语句的主键都不明确,也会产生table lock 。
5、select * from t_items where status=1 for update;(假设为status字段添加了索引)
这条语句明确指定了索引,并且有此数据 , 则产生row lock 。
6、select * from t_items where status=3 for update;(假设为status字段添加了索引)
这条语句明确指定索引,但是根据索引查无此数据 , 也就不会产生lock 。
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以只会在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回用户错误的信息,让用户决定如何去做 。实现乐观锁一般来说有以下2种方式:
Mysql中的事务是什么如何使用什么是事务?
事务是逻辑上mysql中的事务怎么用的一组操作,组成这组操作的各个单元,要不全都成功要不全都失败,这个特性就是事务
注意mysql中的事务怎么用:mysql数据支持事务,但是要求必须是innoDB存储引擎
解决这个问题:
mysql的事务解决这个问题,因为mysql的事务特性,要求这组操作 , 要不全都成功 , 要不全都失败,这样就避免mysql中的事务怎么用了某个操作成功某个操作失败 。利于数据的安全
如何使用:
(1)在执行sql语句之前 , mysql中的事务怎么用我们要开启事务 start transaction;
推荐阅读
- 玉林卖货直播,玉林卖货直播平台
- 南京日报新媒体待遇如何,南京日报社的待遇如何
- word如何往下加时间,word时间怎么在右下角
- 如何进一步办好新媒体,当前如何做好新媒体的管理
- c怎么配置mysql mysql配置mycnf
- 连接redis报错java,连接redis报错connection refused
- 一般u盘接头是什么型号,一般u盘接头是什么型号的
- php获取复选框数据数组 php获取复选框数据数组的函数
- 双11各大电商现状如何,今年双十一,电商交易和发展的情况