事务与锁机制

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

事务定义:

访问并可能更新数据库:一句或一组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 name='ff' where id='1'

非得提交了之后锁才能释放。所以第一句只要不执行完,其他的事务休想动符合条件的记录。

在hibernate里实现悲观锁:

String hqlStr ="from TUser as user where user.name='Erica'";
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 name='xiaoming',version=version+1 where id='1' and version=0;

找不到版本号就重新来呗!这就避免了第二类丢失和不可重复读。

举个例子,比如AB都在修改账户里的钱,版本号0,当前100¥。A读了100,扣了20,交上去就是80,版本号1;B如果没同时读,版本号改完就是2,也就没问题了。如果真和A同时读的,也读了个100¥,那它修改后的版本号就是1,不大于当前版本号,所以不能更新,只好重新操作一遍咯!这个不难理解吧?

当然乐观锁也会出点小麻烦,因为它是程序实现的,不是数据库实现的,所以脏读是没法避免的。比如这个系统回滚了,别的系统可不知道!

在hibernate里实现

<hibernate-mapping>
<class
name="org.hibernate.sample.TUser"
table="t_user"
dynamic-update="true"
dynamic-insert="true"
optimistic-lock="version"
>
……
</class>
</hibernate-mapping>

例子选自http://www.blogjava.net/loocky/archive/2006/11/15/81138.html

这样对象TUser写入关系型数据库用的就是乐观锁了。optimistic-lock="version"表示用版本号控制。


相互学习,欢迎补充

转载于:https://my.oschina.net/tdONEmadao/blog/214412

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401892.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器 VS OSI七层模型

OSI Open Source Initiative&#xff08;简称OSI&#xff0c;有译作开放源代码促进会、开放原始码组织&#xff09;是一个旨在推动开源软件发展的非盈利组织。OSI参考模型&#xff08;OSI/RM&#xff09;的全称是开放系统互连参考模型&#xff08;Open System Interconnection …

Linux运维系统工程师系列---04

和用户登录相关的文件用户登录是需要读取的文件1、/etc/profile2、/etc/bashrc3、/etc/profile.d/*4、~user/.bashrc5、~user/.bash_profile登录shell和非登录shell&#xff1a;[rootlocalhost ~]# su - usr4登录shell[rootlocalhost ~]# su usr4非登录shell非登录shell使用的是…

Linux Wireless架构总结

1、无线网络驱动(ath9k_htc) ath9k_htc是一个基于USB接口的SoftMAC无线网络适配器。为了其驱动能正常工作&#xff0c;首先必须调用usb_register来注册驱动定义的usb_driver&#xff0c;以借助USB Core的力量来处理与USB协议相关的事件。其代码如下&#xff1a;[cpp] view plai…

MySQL 日志文件 说明

MySQL 5.5 官方文档上有关日志的分类&#xff1a;By default, nologs are enabled. The following log-specific sections provide information about the server options that enable logging.--默认情况下&#xff0c;没有启动任何log&#xff0c;可以通过如下log 选项来启动…

Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

前面学习了SDIO接口的WiFi驱动&#xff0c;现在我们来学习一下USB接口的WiFi驱动&#xff0c;二者的区别在于接口不同。而USB接口的设备驱动&#xff0c;我们前面也有学习&#xff0c;比如USB摄像头驱动、USB鼠标驱动&#xff0c;同样都符合LinuxUSB驱动结构&#xff1a; USB设…

我的第一程序语言python

我接触的第一门语言是python,因此对python 可能有着更深厚的感情。感觉学的时间长了&#xff0c;就像是把把它当成是一个朋友&#xff0c;一个伴侣&#xff0c;想去读懂他&#xff0c;理解他&#xff0c;就像是自己的身体可以收放自如。从接触python 到现在也快有五个月了&…

Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析

SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块&#xff0c;内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈&#xff0c;能够实现用户主平台数据通过SDIO口到无线网络之间的转换。SDIO具有传输数据快&#xff0c;兼容SD、MMC接口等特点。 对于SDIO接口的w…

2312llvm,09clang工具下

ClangQuery 在LLVM3.5中引入ClangQuery工具,它可读入一个源文件,交互查询它所关联的ClangAST节点.是帮助查看并学习前端如何表达每行代码的很好工具. 然而,它的主要目标是,你不但可查看程序的AST,而且可测试AST匹配器. 编写重构工具时,你会对使用,包含匹配感兴趣的ClangAST片…

Erlang并发机制 –进程调度

2019独角兽企业重金招聘Python工程师标准>>> Erlang调度器主要完成对Erlang进程的调度&#xff0c;它是Erlang实现软件实时和进程之间公平使用CPU的关键。Erlang运行时&#xff0c;有4种任务需要被调度&#xff1a;进程&#xff0c;Port&#xff0c;Linked-in drive…

Linux 下wifi 驱动开发(二)—— WiFi模块浅析

一、什么是wifi 模块 百度百科上这样定义&#xff1a; Wi-Fi模块又名串口Wi-Fi模块&#xff0c;属于物联网传输层&#xff0c;功能是将串口或TTL电平转为符合Wi-Fi无线网络通信标准的嵌入式模块&#xff0c;内置无线网络协议IEEE802.11b.g.n协议栈以及TCP/IP协议栈。传统的硬件…

VSS2005 上传pdf 空白

加补丁 VS80-KB943847-X86-INTL.exe

Linux 下wifi 驱动开发(一)—— WiFi基础知识解析

一、WiFi相关基础概念 1、什么是wifi 我们看一下百度百科是如何定义的&#xff1a; Wi-Fi是一种可以将个人电脑、手持设备&#xff08;如pad、手机&#xff09;等终端以无线方式互相连接的技术&#xff0c;事实上它是一个高频无线电信号。[1] 无线保真是一个无线网络通信技术…

poj 3348 Cows 求凸包以及凸包的面积

题目来源&#xff1a; http://poj.org/problem?id3348 1:任意多边形p[0,n-1]的面积为 for(int i0 ; i<n-1 ; i){ sum (sk[i]^sk[(i1)%(n) ] )*0.5; } 2: 求凸包&#xff0c; 用graham 模板 代码如下&#xff1a; #include <iostream> #include <algorithm> #in…

Linux 网络设备驱动开发(一) —— linux内核网络分层结构

Linux内核对网络驱动程序使用统一的接口&#xff0c;并且对于网络设备采用面向对象的思想设计。 Linux内核采用分层结构处理网络数据包。分层结构与网络协议的结构匹配&#xff0c;既能简化数据包处理流程&#xff0c;又便于扩展和维护。 一、内核网络结构 在Linux内核中&#…

windows清理剪切板

开始——运行——clipbrd &#xff08;WINR&#xff09;转载于:https://blog.51cto.com/eblog/1390662

Linux 网络设备驱动开发(二) —— Linux 网络栈剖析

一、协议简介 虽然对于网络的正式介绍一般都参考了 OSI&#xff08;Open Systems Interconnection&#xff09;模型&#xff0c;但是本文对 Linux 中基本网络栈的介绍分为四层的 Internet 模型&#xff08;如图 1 所示&#xff09;。 图 1. 网络栈的 Internet 模型 这个栈的最底…

Android之BroadcastReceiver 监听系统广播

绑定广播有两种方式 一.配置文件绑定&#xff0c;在程序未启动也能监听 二.代码方式绑定&#xff0c;在程序启动后才能监听 1.绑定和取消绑定广播 public class MainActivity extends Activity {private Button registerButtonnull;private Button unRegisterButtonnull;privat…

Linux 网络设备驱动开发(三) —— 网络设备驱动基本原理和框架

一、协议栈层次对比 二、Linux网络子系统 Linux网络子系统的顶部是系统调用接口层。它为用户空间提供的应用程序提供了一种访问内核网络子系统的方法&#xff08;socket&#xff09;。位于其下面是一个协议无关层&#xff0c;它提供一种通用的方法来使用传输层协议。然后是具…

国产杀毒软件也开始支持虚拟化

今天不小心看到一个较老的“新”闻&#xff0c;国产安全软件厂商瑞星已经推出支持VMware vshield Endpoint技术的防病毒产品&#xff0c;也就是说如果客户今天使用的是VMware的虚拟化软件&#xff0c;上面运行的所有虚拟机就不需要安装传统的防病毒软件程序&#xff0c;而可以直…

VRP平台基本操作

一、显示系统信息 <Huawei>display version 图上所示可以知道VRP平台信息&#xff0c;运行的版本&#xff0c;运行的时间 二、修改和查看设备系统时间参数 1.查看时间 <Huawei>display clock 2.修改系统日期和时间 三、进入系统视图界面 <Huawei>system-view…