网站制作视频教程免费,中国建筑人才信息网,wentommy wordpress,保险咨询网站建设2019独角兽企业重金招聘Python工程师标准 事务定义#xff1a; 访问并可能更新数据库#xff1a;一句或一组SQL#xff0c;或者是一段程序#xff0c;反正update了就是事务 ACID的4原则#xff1a; 原子性#xff1a; 一致性#xff1a; 隔离性#xff1… 2019独角兽企业重金招聘Python工程师标准 事务定义 访问并可能更新数据库一句或一组SQL或者是一段程序反正update了就是事务 ACID的4原则 原子性 一致性 隔离性不被干扰 持久性永久改变 COMMIT提交所有操作 ROLLBACK回滚(撤销) 表的类型 MYSQL 的INNODB和BDB表支持事务但MyISAM(默认)不支持事务 多事务可能的问题 第一类丢失更新撤销一个事务影响已提交事务 脏读读到别的事务未提交的数据而那个事务恰巧回滚了…… 虚读(幻读)读到别的事务新插入的数据 不可重复读读到别的事务更新的数据结果两次读取的数据不一样了。 第二类丢失更新覆盖别的事务更新的数据 隔离级别 Serializable(串行化)事务全看不到其他事务的更新就是一个事务接着一个事务没啥并发性可言。当然它是隔离最高的了 Repeatable Read(可重复读)读写都会阻塞所以事务间读和写互相看不到但能看到其他事务新插入的记录解决不了虚读问题。 Read Commited读已提交数据写的时候阻塞写和读读的时候不阻塞写。结果事务看到其他事务新插入记录和更新 Read Uncomitted读未提交数据事务看到其他事务未提交的插入记录和更新。也就是说隔离最弱没啥解决能力。 当然Read Commited用的最多因为它安全、并发也好。但为了避免错误的读写还需要用到乐观锁或者悲观锁。 悲观锁其他事务会同时访问资源就是上锁。它是数据库的锁机制不是程序模块实现的因为可能多个系统在动数据库嘛。 select * from person for update
update person set nameff where id1 非得提交了之后锁才能释放。所以第一句只要不执行完其他的事务休想动符合条件的记录。 在hibernate里实现悲观锁 String hqlStr from TUser as user where user.nameErica;
Query query session.createQuery(hqlStr);
query.setLockMode(user,LockMode.UPGRADE); // 加锁
List userList query.list();// 执行查询获取数据 类名是TUser 字段是user,原理上还是数据库的 for update 子句 乐观锁访问时其他事务修改的概率很低大不了重读一次。完全靠隔离级别。如果一次操作开销很大建议用悲观锁。数据库里用版本号实现说白了就是有个version字段嘛 比如 select * from person
select * from person
update person set namexiaoming,versionversion1 where id1 and version0; 找不到版本号就重新来呗这就避免了第二类丢失和不可重复读。 举个例子比如AB都在修改账户里的钱版本号0当前100。A读了100扣了20交上去就是80版本号1B如果没同时读版本号改完就是2也就没问题了。如果真和A同时读的也读了个100那它修改后的版本号就是1不大于当前版本号所以不能更新只好重新操作一遍咯这个不难理解吧 当然乐观锁也会出点小麻烦因为它是程序实现的不是数据库实现的所以脏读是没法避免的。比如这个系统回滚了别的系统可不知道 在hibernate里实现 hibernate-mapping
class
nameorg.hibernate.sample.TUser
tablet_user
dynamic-updatetrue
dynamic-inserttrue
optimistic-lockversion……
/class
/hibernate-mapping 例子选自http://www.blogjava.net/loocky/archive/2006/11/15/81138.html 这样对象TUser写入关系型数据库用的就是乐观锁了。optimistic-lockversion表示用版本号控制。 相互学习欢迎补充 转载于:https://my.oschina.net/tdONEmadao/blog/214412