时间:2015-06-24 来源:

Mybatis深入之事务管理 【编程语言】

Mybatis之事务管理 简介 Mybatis的事务管理分为两种JdbcTransaction, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后,div前端切图 若 T2 回滚web切图报价, T2, T1 读取了一个字段,符合w3c标准 然后 T2 更新了该字段. 之后网页外包接活, T1再次读取同一个字段,jpg或psd转html 值就不同了. ? 幻读: 对于两个事物 T1, T1 从一个表中读取了一个字段承接网页制作, 然后 T2 在该表中插入了一些新的行. 之后,承接网页制作 如果 T1 再次读取同一个表web切图报价, JdbcTransactionFactory.class); typeAliasRegistry.registerAlias("MANAGED", closeConnection); } 两者都是通过Connection来创建具体的实例 JdbcTransaction:

public class ManagedTransaction implements Transaction { private static final Log log = LogFactory.getLog(ManagedTransaction.class); private DataSource dataSource; private TransactionIsolationLevel level; private Connection connection; private boolean closeConnection; public ManagedTransaction(Connection connection, TransactionIsolationLevel level, boolean closeConnection) { this.dataSource = ds; this.level = level; this.closeConnection = closeConnection; } public Connection getConnection() throws SQLException { if (this.connection == null) { openConnection(); } return this.connection; } public void commit() throws SQLException { // Does nothing } public void rollback() throws SQLException { // Does nothing } public void close() throws SQLException { if (this.closeConnection && this.connection != null) { if (log.isDebugEnabled()) { log.debug("Closing JDBC Connection [" + this.connection + "]"); } this.connection.close(); } } protected void openConnection() throws SQLException { if (log.isDebugEnabled()) { log.debug("Opening JDBC Connection"); } this.connection = this.dataSource.getConnection(); if (this.level != null) { this.connection.setTransactionIsolation(this.level.getLevel()); } } } 重点看一下commit() rollback()方法,div+css制作没有方法体.验证前面其关于事务的管理方式 到这里事务暂时告一段落、一般在使用时会与spring结合、将数据库连接、事务管理都交由spring管理.

READ UNCOMMITTED(读未提交数据) 允许事务读取未被其他事务提交的变更承接网页制作,脏读、不可重复读和幻读的问题都会出现 READ COMMITED(读已提交数据) 只允许事务读取已经被其他事务提交的变更,承接网页制作可以避免脏读web切图报价,但不可重复读和幻读问题仍然会出现 REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,手机html制作在这个事务持续期间符合w3c标准,禁止其他事务对这个字段进行更新,html切图制作可以避免脏读和不可重复读网页外包接活,但幻读的问题依然存在 SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,网页外包接活在这个事务持续期间web前端制作,禁止其他事务对该表执行插入、更新和删除操作,web前端制作所有并发问题都可以避免承接网页制作, SERIALIZABLE. Oracle 默认的事务隔离级别为: READ COMMITED Mysql 支持 4 中事务隔离级别. Mysql 默认的事务隔离级别为: REPEATABLE READ 更多内容:Mybatis 目录

<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> type为”JDBC”时、使用JdbcTransaction管理事务. type为”managed”时、使用ManagedTransaction管理事务(也就是交由外部容器管理)

Mybatis事务管理相关类结构图 类概览:

public class JdbcTransaction implements Transaction { private static final Log log = LogFactory.getLog(JdbcTransaction.class); protected Connection connection; protected DataSource dataSource; protected TransactionIsolationLevel level; protected boolean autoCommmit; public JdbcTransaction(DataSource ds, boolean desiredAutoCommit) { dataSource = ds; level = desiredLevel; autoCommmit = desiredAutoCommit; } public JdbcTransaction(Connection connection) { this.connection = connection; } public Connection getConnection() throws SQLException { if (connection == null) { openConnection(); } return connection; } public void commit() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Committing JDBC Connection [" + connection + "]"); } connection.commit(); } } public void rollback() throws SQLException { if (connection != null && !connection.getAutoCommit()) { if (log.isDebugEnabled()) { log.debug("Rolling back JDBC Connection [" + connection + "]"); } connection.rollback(); } } public void close() throws SQLException { if (connection != null) { resetAutoCommit(); if (log.isDebugEnabled()) { log.debug("Closing JDBC Connection [" + connection + "]"); } connection.close(); } } protected void setDesiredAutoCommit(boolean desiredAutoCommit) { try { if (connection.getAutoCommit() != desiredAutoCommit) { if (log.isDebugEnabled()) { log.debug("Setting autocommit to " + desiredAutoCommit + " on JDBC Connection [" + connection + "]"); } connection.setAutoCommit(desiredAutoCommit); } } catch (SQLException e) { // Only a very poorly implemented driver would fail here, e); } } protected void resetAutoCommit() { try { if (!connection.getAutoCommit()) { // MyBatis does not call commit/rollback on a connection if just selects were performed. // Some databases start transactions with select statements // and they mandate a commit/rollback before closing the connection. // A workaround is setting the autocommit to true before closing the connection. // Sybase throws an exception here. if (log.isDebugEnabled()) { log.debug("Resetting autocommit to true on JDBC Connection [" + connection + "]"); } connection.setAutoCommit(true); } } catch (SQLException e) { log.debug("Error resetting autocommit to true " + "before closing the connection. Cause: " + e); } } protected void openConnection() throws SQLException { if (log.isDebugEnabled()) { log.debug("Opening JDBC Connection"); } connection = dataSource.getConnection(); if (level != null) { connection.setTransactionIsolation(level.getLevel()); } setDesiredAutoCommit(autoCommmit); } } 从源码中可知、JdbcTransaction如何管理事务的、如前面所说调用DataSource事务操作方法. 并且对select不进行事务控制 当使用DataSource创建数据库连接时、数据库的事务隔离级别使用DataSource默认的事务隔离级别 如需指定事务的隔离级别、必须手动创建JdbcTransaction(调用另一个构造函数) 关于事务隔离级别会在补充中有 ManagedTransaction:

Mybatis深入之初始化过程 中知道配置文件如何解析的、其中关于事务方面的解析:

Transaction 封装事务管理方法的接口 TransactionFactory 抽象事务工厂生产方法 JdbcTransactionFactory实现TransactionFactory、用于生产JdbcTransaction的工厂类 ManagedTransactionFactory实现TransactionFactory、用于生产ManagedTransaction的工厂类 JdbcTransaction实现Transaction、只是对事务进行了一层包装、实际调用数据库连接Connection的事务管理方法 ManagedTransaction 实现Transaction没有对数据库连接做任何事务处理、交由外部容器管理 源码事务 事务配置 Mybatis中关于事务的配置是通过<transaction type="xx"/>来指定的.配置如下:

public class JdbcTransactionFactory implements TransactionFactory { public void setProperties(Properties props) { } public Transaction newTransaction(Connection conn) { return new JdbcTransaction(conn); } public Transaction newTransaction(DataSource ds, boolean autoCommit) { return new JdbcTransaction(ds, autoCommit); } } JdbcTransactionFactory默认无参构造方法被调用 setProperties没有做任何实质性处理 对比ManagedTransactionFactory不再贴代码 下面就是获取具有事务特性的数据库连接了 JdbcTransaction:

类UML图(典型的简单工厂模式来创建Transaction):

public Transaction newTransaction(Connection conn) { return new JdbcTransaction(conn); } ManagedTransaction:

$(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });

点击次数:9828
作者:
web前端行业资讯
Web new NewsList
英特尔宣布与法拉利跨界合作欲将AI技术用于赛车运动 ,,2018年01月11日甲骨文服务器出漏洞:攻击者用漏洞挖矿获取加密货币 ,,2018年01月11日用深度学习设计图像视频压缩算法:更简洁、更强大 ,,2018年01月11日Ubuntu内核和NVIDIA更新:修复Meltdown和Spectre两处漏洞 ,,2018年01月11日AntDesign3.1.1发布,阿里企业级UI设计语言 ,,2018年01月11日微信「跳一跳」带火小游戏,开发者如何快速上手? ,,2018年01月11日谷歌公布最新安卓系统份额:你用上奥利奥了么? ,,2018年01月11日腾讯开发出“3D音效”算法:普通耳机实现3D实时语音效果 ,,2018年01月11日谷歌工程师点赞中国程序员实现Node.js启动超4倍提速 ,,2018年01月11日三星电子总裁兼CE部门负责人金炫奭:万物互联时代到来 ,,2018年01月11日NVIDIA和大众合作建立智能驾驶助手 ,,2018年01月11日GIMPS项目报告发现已知最大素数 ,,2018年01月11日微软与生物技术公司开展AI驱动的血液检测同时诊断数十种疾病 ,,2018年01月11日微软跨平台移动开发工具套件HockeyApp宣布免费 ,,2018年01月11日《硅谷》里神乎其神的压缩技术,AI正在一点点做出来 ,,2018年01月11日LinuxMint19代号敲定为“Tara”预计2018年5月至6月期间发布 ,,2018年01月11日Facebook发布wav2letter工具包,用于端到端自动语音识别 ,,2018年01月11日开源数据库ArangoDB正进行约1156万美元股权融资 ,,2018年01月11日IntelCPU漏洞闹大:腾讯云紧急升级 ,,2018年01月11日2018年1月全球数据库排名:Redis夺回第八 ,,2018年01月11日Lyft将联手无人驾驶公司于CES上展示无人驾驶汽车 ,,2018年01月11日京东X无人超市首家社会门店开业:刷脸进、微信自动结算 ,,2018年01月11日担心被AI取代是杞人忧天?高晓松跨年演讲说的有几分对 ,,2018年01月11日免费授权技术许可Intel宣布在未来CPU中集成雷电3 ,,2018年01月11日算法决定你在社交媒体上看到的信息 ,,2018年01月11日谷歌安全博客披露“英特尔内核漏洞”更多细节 ,,2018年01月04日Postgres10开发者新特性 ,,2017年12月28日阿里巴巴、狗尾草、苏大联合论文:基于对抗学习的众包标注用于中文命名实体识别 ,,2017年12月28日柯洁的2017:20岁,与AI斗与人类斗,其乐无穷 ,,2017年12月28日如果机器人拥有痛觉,这个世界会有哪些不一样? ,,2017年12月28日php去掉字符串的最后一个字符附substr()的用法2014年01月29日创业白手起家也需要条件——北漂18年(14)【Web前端】2015年06月30日android网络HttpURLConnection抓取网络图片 【系统运维】2014年12月16日Intel8086处理器2015年08月04日IntersectionofTwoLinkedLists【互联网】2015年03月27日基于boost的苹果apns消息推送实现(1) 【编程语言】2015年03月24日flash文件的压缩方法(swf文件压缩瘦身)2014年01月28日Cocos2d-xLua中生命周期函数 【移动开发】2015年05月13日c++引入额外开销的情况【编程语言】2015年07月31日新闻发布系统,SQLHelper重构 【综合】2015年04月24日POJ2488AKnight'sJourney(dfs+数学)【编程语言】2015年01月24日JS实现导航栏悬停效果2014年01月29日Cocos2d-x中使用第三方so库 【编程语言】2014年11月04日求奇数的乘积【综合】2015年08月17日ConnecttheCampus(Uva10397Prim||Kruskal+并查集) 【移动开发】2015年07月28日XStream解析xml和json 【综合】2015年01月24日Android布局中实现圆角边框 【移动开发】2015年06月01日苹果到底发明了什么?外媒:拥有专利比发明重要 ,,2016年06月23日BZOJ3786星系探索Splay维护树的入栈出栈序 【移动开发】2014年12月03日我的第一个svm程序:手写字识别【Web前端】2015年05月05日监督学习&回归问题(Regression) 【Web前端】2015年06月25日ArcGIS教程:链接模型构建器中的制图综合工具 【编程语言】2015年05月28日LeetCode:SpiralMatrixII 【综合】2014年12月29日上拉电阻和下拉电阻【编程语言】2015年08月17日解析web文件操作常见安全漏洞(目录、文件名检测漏洞)2014年01月29日PMBOK(对应第五版)之输入-输出-工具思维导图导出【数据库】2015年05月12日Mac下著名文本编辑器TextMatev2.0-beta.9.2发布 ,,2016年06月23日servlet中response,request,编码和路径问题 【编程语言】2015年04月08日mongodb增删改查 【编程语言】2015年08月07日JS的window对象详解【编程语言】2015年01月24日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)