OTL操纵MySql处理事务的方法

导入需要改为事物来处理,导入出错的时候就进行回滚。
现在的文件导入,通过多个filecount进行导入。
出错率较高,
现在批量导入,都是从文件中导入,怎么从数据库中批量导入呢--是从文件到数据库,不是从数据库到数据库。接收到导入的请求,批量数据,调用事物进行。
只要没有用户的输入,就可以避免sql注入的风险
通过otl可以设置事物,应该注意otl_stream缓冲区大小的合理设置(参见13.1小节)以及OTL默认的语句执行成功后立刻提交事务。对于批量操作,OTL默认的语句执行成功后立刻提交事务的操作方式往往不实用。例如对于批量更新10000条记录,缓冲区大小为1000的情况,当缓冲区填满时更新操作被执行,执行成功后当前事务被立刻提交,如果在此后的处理中出现错误,根本没有办法通过回滚事务取消之前的更新。防止语句执行后立刻提交事务的方法请参见12.1小节
缓冲区大小为 otl_stream 第一个参数,我们目前都是1,即执行完立刻提交,可以设置多个。

这个缓冲区到底是什么意思
记录数,但是设为2就是隔一个插入一次
有问题就会跳出了
otl_explicit_select:指定该流为一个简单的SELECT语句流;
otl_implicit_select:指定该流为一个返回结果集的流;
start transaction
commit
不能,应用otl自己的直接执行命令 otl_cursor::direct_exec都不能声明事物
otl_nocommit_stream不能够的原因1.不是oracal数据库2.没有声明事物。
otl_stream的buffer size,无法设定,不知为啥。
    MySQL在innodb存储引擎的行级锁的情况下才可支持事务,而Oracle则完全支持事务
(1) 对事务的提交
    MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写commit;指令或者点击commit按钮
(2) 分页查询
    MySQL是直接在SQL语句中写"select... from ...where...limit  x, y",有limit就可以实现分页;而Oracle则是需要用到伪列ROWNUM和嵌套查询
(3) 事务隔离级别
      MySQL是read commited的隔离级别,而Oracle是repeatable read的隔离级别,同时Oracle支持serializable的隔离级别,可以实现最高级别的
    读一致性。每个session提交后其他session才能看到提交的更改。Oracle通过在undo表空间中构造多版本数据块来实现读一致性,每个session
    查询时,如果对应的数据块发生变化,Oracle会在undo表空间中为这个session构造它查询时的旧的数据块
    MySQL没有类似Oracle的构造多版本数据块的机制,只支持read commited的隔离级别。一个session读取数据时,其他session不能更改数据,但
    可以在表最后插入数据。session更新数据时,要加上排它锁,其他session无法访问数据
oracle中事务从上一个commit或rollback开始;

但是MySQL中事务的开始必须要有START TRANSACTION;这才标志着一个事物的开始,否则使用rollback是无法回滚数据的。
InnoDB影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行SQL前调用BEGIN,多条SQL形成一个事物(即使AUTOCOMMIT打开也可以),将大大提高性能。

最终完成了1.表的引擎改为InnoDB:ALTER TABLE Ttest ENGINE=InnoDB;
2.  otl_cursor::direct_exec(db,"START TRANSACTION;");和commit来完成事物
3.中间不需要任何处理,依旧用otl_stream
4.有错误不会提交,具有原子性和一致性隔离性和持久性。
5.绕了一大圈,最终用只是一个语句的问题。
被例子误导,Oracle和MYSQL不同,所以也是不通的。Oracle事物不需要声明,所以麻烦的一比,需要OTL一堆函数才能让他不自动提交。相比而言,mysql反而更方便,手动声明和提交,包含一下就行了,爽的一批!!!
脏读:事物之间没有隔离。可以查到没有提交的事物
不可重复读:一个事物中读取两次前后被修改的数据导致两次查询结果不一致。
幻读:事物中两次统计前后别的事物对表进行修改导致两次统计结果不同。
1、事务隔离级别为读提交时,写数据只会锁住相应的行

2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。


3、事务隔离级别为串行化时,读写数据都会锁住整张表

4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

参考:

事务四大特征:原子性,一致性,隔离性和持久性(ACID)

https://blog.csdn.net/lovesomnus/article/details/44459675

MySQL的四种事务隔离级别

https://www.cnblogs.com/huanongying/p/7021555.html

两个例子说明,虽然被误导了好久(oracle和MYSQL差异巨大),但是也贴上来,虽然没什么用

OTL技术应用

https://www.cnblogs.com/skyme/archive/2010/11/08/1871509.html

https://blog.csdn.net/rain_qingtian/article/details/12749177

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OTL(Ov{er} The Last Version 4)是一个开源的库,用于在C++中连接和操作数据库。我将使用OTLv4来连接MySQL数据库。 首先,我们需要准备好OTLv4库和MySQL的驱动程序。我们可以从OTL官方网站下载OTLv4库,并且从MySQL官方网站下载MySQL的驱动程序。确保将这些文件保存在适当的目录中,并设置好编译器的相关设置。 接下来,我们需要包含OTL头文件并初始化OTL库。在代码中添加以下代码: #include <otlv4.h> int main() { // 初始化OTLotl_connect::otl_initialize(); // 连接MySQL数据库 otl_connect db; try { // 使用MySQL驱动程序连接数据库 db.rlogon("mysql_user_name/mysql_password@mysql_data_source"); // 这里的mysql_user_name是你的MySQL用户名, // mysql_password是你的MySQL密码, // mysql_data_source是你的MySQL数据源地址。 // 执行查询或操作 // 断开数据库连接 db.disconnect(); } catch (otl_exception& e) { // 处理异常 std::cerr << "OTL Error: " << e.msg << std::endl; } // 清理OTLotl_connect::otl_terminate(); return 0; } 以上代码演示了如何使用OTLv4连接MySQL数据库。其中,otl_connect类用于表示数据库连接,otl_exception类用于处理异常。在try块中,我们使用驱动程序的rlogon函数连接数据库,并可以在此处执行查询或操作。最后,在catch块中,我们可以处理发生的异常。在代码的结尾处,我们清理OTL库以释放资源。 通过以上步骤,我们就可以使用OTLv4库在C++中连接MySQL数据库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值