session_flush

hibernate:session_flush;

session flush测试:

session flush方法主要做了两件事:

* 清理缓存
* 执行sql

session在什么情况下执行flush

* 默认在事务提交时
* 显示的调用flush
* 在执行查询前,如:iterate

hibernate按照save(insert),update、delete顺序提交相关操作


* 在执行事务提交前(commit)前会先执行flush,session-flush分为两种执行方法,手动和自动。

* 自动为系统默认隐含执行,手动为在需要执行的地方插入session-flush即可。



注:select @@tx_isolation;    mysql的查询级别命令
    set transaction isolation level read uncommitted;   mysql设置级别的命令read uncommitted 为级别;总共有4个级别;

    mysql默认隔离级别是“可重复读” ;
    read uncommitted 为未提交读




“uuid”:如果id为uuid的话,执行插入后在save前是不会发出sql语句的,只是将user信息纳入到了session的管理,执行save后将保存。

“native和其它id方式”:在执行save前会发出sql语句,信息将插入到数据库中。
“脏数据”:save后但没事务提交的数据(save后但没提交就能读的数据)。

事务级别有4种,越高级别限制越严格

未提交读:未提交就能读到;
以提交读:已经提交的数据能读到;
可重复读:允许重复读(第一次读出的数据下次在读还是这个数据。);
序列化读:(性能非常不好,并发性几乎没有,当前的线程只有你能执行,只有你放弃了以后别人才能访问或做操作,就像悲观锁一样。)

//---------------------------------------------------------------

脏读:没有提交的数据就能读到;
不可重复读:例如第一次读出来时张三,在读出来就是李四,在读出来有问题的数据(不可在重复读。)(用悲观锁可以解决)
幻读:针对插入问题的。例如插入5条记录,但在查询会查到10条记录。因为表是所有线程都可以访问的,除非用锁来锁住。例如序列化读;


session.evict;


* 就是逐出在缓存中的对象。(就是save后的数据,在缓存中的);

例:session.save(user);
    session.evict(user);
    .commit();(提交事务)

你可能感兴趣的:(sql,mysql,Hibernate)