ItGo.me - 专注IT技术分享

首页 > Mybatis > mybatis使用版本控制并发

mybatis使用版本控制并发

时间:2015-07-03来源:网友分享 点击:
mybatis使用版本控制并发,没什么特别,可利用事务并发访问策略(同一系统事务):

  乐观锁:不是在数据库端锁住的,而是程序控制的;
    悲观锁:在数据库里面锁住,类似for update查询;
    
一、乐观锁
    认为系统中的事务并发更新不会很频繁。每次提交一个事务更新,如果发现数据被其他事务修改过,则修改失败。
实现方法:
1、版本(version)字段:
    更新的时候给版本号字段加上1,然后UPDATE会返回一个更新结果的行数,通过这个行数去判断。

UPDATE 这样写:
UPDATE T_USER u
   SET u.userName = #userName#,u.version = u.version + 1
 WHERE u.userId = #userId# AND u.version = #version#
   
   #程序...
   If(rowsUpdated= =0){
          throws new OptimisticLockingFailureException();
  }
如果更新执行返回的数量是 0 表示产生并发修改了,需要重新获得最新的数据后再进行更新操作。
Hibernate、JPA等ORM框架或者实现,是使用版本号,再判断UPDATE后返回的数值,如果这个值小于1时则抛出乐观锁并发修改异常.


2.时间戳(timestamps):
    第二种实现方式和第一种差不多,同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。
    缺点就是,当并发事务时间间隔小于当前系统平台的最小时间单位时,会发生覆盖前一个事务结果的问题。基于所有属性进行检测:比较每个字段在读取后有没有被修改过。

二、悲观锁
    认为系统中的并发更新会很频繁,并且事务失败了重来的开销很大。每次一个事务读取某一条记录,就会把这条记录锁住,这样其他事务要想更新,必须等以前的事务提交或者回滚解除锁。可以控制不可重复读的问题,但是无法避免幻读。
    
JDBC中使用悲观锁:
 select * from T_USER where ... for update.



mybatis配置参数及默认值

defaultStatementTimeout设置超时时间,它决定驱动等待数据库响应的秒数。 cacheEnabled 该配置影响的所有映射器中配置的缓存的全局开关。 ...

mybatis批量插入insert

MyBatis中批量插入insert的方法: 方法一: insert id=insertBatch parameterType=java.util.List insert into t_user(id,name) values foreach collection=list item=user index=index separator=, ( #{user.id}, #{user.name}) /foreach /insert 方法二:...

mybatis使用版本控制并发

mybatis使用版本控制并发,没什么特别,可利用事务并发访问策略(同一系统事务): 乐观锁:不是在数据库端锁住的,而是程序控制的; 悲观锁:在数据库里面锁住,类似for update查询;...

mybatis使用版本控制并发,没什么特别,可利用事务并发访问策略(同一系统事务): 乐观锁:不是在数据库端锁住的,而是程序控制的; 悲观锁:在数据库里面锁住,类似for update查询;
------分隔线----------------------------