TangYuan之事务

TangYuan之事务


1. 事务的定义

Tangyuan中,我们可以通过以下配置定义一个事务:

<transaction id="tx_01" behavior="required" isolation="default" />

transaction节点属性说明:

属性名 用途及说明 必填 取值
id 事务定义标识,不可重复 Y 用户定义
behavior 事务的传播级别,默认required,可参考Spring事务,默认required N required<br />supports<br />mandatory<br />requires_new<br />not_supported<br />never<br />
never 事务的隔离级别,默认default N default<br />read_uncommitted<br />read_committed<br />repeatable_read<br />serializable<br />

behavior事务传播属性说明:

取值 用途说明
required 表示当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。
supports 表示当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行
mandatory 表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常
requires_new 表示当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。
not_supported 表示该方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执行
never 表示当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常

isolation说明:

取值 用途说明
default 默认设置,同read_uncommitted
read_uncommitted 脏读<br /> * 脏读又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到的数据是无效的。<br /> * 脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。 因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。
read_committed 不可重复读<br /> * 不可重复读,是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。<br /> * 这是由于查询时系统中其他事务修改的提交而引起的。比如事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。<br /> * 一种更易理解的说法是:在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据。<br /> * 那么,在第一个事务的两次读数据之间。由于第二个事务的修改,那么第一个事务读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。
repeatable_read 可重复读取<br />* 可重复读(Repeatable Read),当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。 因此,如果在同一个事务中发出同一个SELECT语句两次或更多次,那么产生的结果数据集总是相同的。<br /> * 因此,使用可重复读隔离级别的事务可以多次检索同一行集,并对它们执行任意操作,直到提交或回滚操作终止该事务。
serializable 同步事务<br /> * 提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。<br /> * 如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

2. 事务的使用

有了上述事务的定义,接下来开始事务的使用。Tangyuan中每个SQL服务都需要使用事务,或者说每个SQL服务在执行期间都需要按照指定的事务定义开启事务,执行SQL命令。我们可以通过三种方式设置SQL服务使用的事务定义。

1.在SQL服务中,手工设置

<selectOne id="getUserById" txRef="tx_01" dsKey="ds">
    SELECT * from user WHERE user_id = #{user_id}
</selectOne>    

示例中的配置通过txRef属性手工指定使用tx_01的事务定义

2.按照SQL服务ID匹配

<setDefaultTransaction type="method">
    <property name="select*"     value="tx_01"/>
    <property name="get*"         value="tx_01"/>
    <property name="update*"     value="tx_02"/>
    <property name="insert*"     value="tx_02"/>
    <property name="delete*"     value="tx_02"/>
</setDefaultTransaction>

示例中的配置表示按照SQL服务的名称也就是ID来匹配需要使用的事务定义。比如SQL服务selectUser将使用tx_01事务定义,SQL服务updateUser将使用tx_02事务定义,需要注意的复合SQL将不会根据setDefaultTransaction来匹配事务,需要用户手工指定。

3.按照SQL服务类型匹配

<setDefaultTransaction type="command">
    <property name="selectOne"     value="tx_01"/>
    <property name="selectSet"     value="tx_01"/>
    <property name="update"     value="tx_01"/>
    <property name="insert"     value="tx_01"/>
    <property name="delete"     value="tx_01"/>
</setDefaultTransaction>

示例中的配置表示按照SQL服务的类型也就是标签来匹配需要使用的事务定义。比如用<selectOne>标签定义SQL服务将使用tx_01事务定义,用<update>标签定义的SQL服务将使用tx_02事务定义,需要注意的复合SQL将不会根据setDefaultTransaction来匹配事务,需要用户手工指定。

3. setDefaultTransaction节点配置

Schema设计图

schema设计图

setDefaultTransaction节点属性说明

属性名 用途及说明 必填 取值
type 默认事务的匹配模式 Y method:按照SQL服务的名称匹配<br />command:按照SQL服务的类型匹配

property节点属性说明

属性名 用途及说明 必填 取值
name method模式下:SQL服务名称,支持*表达式<br />command模式下:SQL服务标签名 Y 用户定义
value 需要引用的事务定义ID Y 用户定义
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容