事务;

事务是任何健壮数据库系统的基本组成,它们 防止错误和数据库腐败通过确保有关数据的改变是原子发生的(不可分割的,要么所有要么什么都不做)

这个章节应用于数据库支持事务和 AutoCommit 是关闭的,查看"AutoCommit" 使用对于各种类型的数据库。

推荐的方式实现健壮的事务在Perl应用是使用RaiseError and eval { ... } 

  $dbh->{AutoCommit} = 0;  # enable transactions, if possible
$dbh->{RaiseError} = 1;
eval {
foo(...) # do lots of work here
bar(...) # including inserts
baz(...) # and updates
$dbh->commit; # commit the changes if we get this far
};
if ($@) {
warn "Transaction aborted because $@";
# now rollback to undo the incomplete changes
# but do it in an eval{} as it may also fail
eval { $dbh->rollback };
# add other application on-error-clean-up code here
} #!/usr/bin/perl
use DBI;
$db_name='zjzc';
$ip='127.0.0.1';
$user="root";
$passwd="1234567";
$dbh="";
$dbh = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd,{
RaiseError => 1,
AutoCommit => 0
}) or die "can't connect to database ". DBI-errstr;
eval{
$dbh->do("insert into test values('$ARGV[0]')") ;
sleep (100);
$dbh->commit();};
if( $@ ) {
#warn "Database error: $DBI::errstr\n";
$dbh->rollback(); #just die if rollback is failing
};
$dbh->disconnect; 如果RaiseError 熟悉没有被设置,DBI 请求需要手动检查错误,像这样: $h->method(@args) or die $h->errstr; RaiseError设置后,DBI会自动的die 如果DBI方法调用处理失败,你不需要测试每个方法的返回值 评价方法的主要有点是 事务会正确的回滚 当任何代码(不只是DBI请求) 在内部程序dies 由于任何原因。 使用 $h->{RaiseError} 属性的主要优势是 DBI请求会被自动检查, [root@wx03 sbin]# cat a1.pl
use DBI;
use POSIX;
$db_name='scan';
$ip='127.0.0.1';
$user="root";
$passwd="xxx";
$dbh = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd,{
RaiseError => 1,
AutoCommit => 0
}) or die "can't connect to database ". DBI-errstr;
eval{
my $XDATE = strftime("%Y%m%d%H%M%S",localtime());
print "\$XDATE is $XDATE\n";
$dbh->do("update t1 set c1=999 where c1=100") ;
$dbh->commit();};
if( $@ ) {
my $XDATE = strftime("%Y%m%d%H%M%S",localtime());
#warn "Database error: $DBI::errstr\n";
print "\$XDATE is $XDATE\n";
$dbh->rollback(); #just die if rollback is failing
};
$dbh->disconnect;
[root@wx03 sbin]# perl a1.pl
$XDATE is 20160823110539
DBD::mysql::db do failed: Lock wait timeout exceeded; try restarting transaction at a1.pl line 14.
$XDATE is 20160823110630 | innodb_lock_wait_timeout | 50 [root@wx03 sbin]# perl a1.pl
$XDATE is 20160823110743
DBD::mysql::db do failed: Table 'scan.t19' doesn't exist at a1.pl line 14.
$XDATE is 20160823110743
[root@wx03 sbin]# cat a1.pl
use DBI;
use POSIX;
$db_name='scan';
$ip='127.0.0.1';
$user="root";
$passwd="xxx";
$dbh = DBI->connect("dbi:mysql:database=$db_name;host=$ip;port=3306",$user,$passwd,{
RaiseError => 1,
AutoCommit => 0
}) or die "can't connect to database ". DBI-errstr;
eval{
my $XDATE = strftime("%Y%m%d%H%M%S",localtime());
print "\$XDATE is $XDATE\n";
$dbh->do("update t19 set c1=999 where c1=100") ;
$dbh->commit();};
if( $@ ) {
my $XDATE = strftime("%Y%m%d%H%M%S",localtime());
#warn "Database error: $DBI::errstr\n";
print "\$XDATE is $XDATE\n";
$dbh->rollback(); #just die if rollback is failing
};
$dbh->disconnect;
[root@wx03 sbin]# perl a1.pl
$XDATE is 20160823110746
DBD::mysql::db do failed: Ta

mysql DBI 事务控制的更多相关文章

  1. MySql的事务控制(TCL语言)

    ⒈事务 一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行. ⒉事务的特性(ACID) 1.原子性(Atomicity):一个事务不可再分割,要么都执行要么都不执行. 2. ...

  2. 【MyBatis】MyBatis 连接池和事务控制

    MyBatis 连接池和事务控制 文章源码 MyBaits 连接池 实际开发中都会使用连接池,因为它可以减少获取连接所消耗的时间.具体可查看 MyBatis 数据源配置在 SqlMapConfig.x ...

  3. Mysql锁机制和事务控制

    如何加锁 锁定表的语法:    LOCK TABLES    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}    [, tbl_n ...

  4. mysql 开发基础系列20 事务控制和锁定语句(上)

    一.概述 在mysql 里不同存储引擎有不同的锁,默认情况下,表锁和行锁都是自动获得的,不需要额外的命令, 有的情况下,用户需要明确地进行锁表或者进行事务的控制,以便确保整个事务的完整性.这样就需要使 ...

  5. 14.Mysql事务控制和锁定

    14.事务控制和锁定存储引擎和锁: MyISAM和MEMORY存储引擎的表支持表级锁: BDB存储引擎的表支持页级锁: InnoDB存储引擎的表支持行级锁.默认情况下,表锁和行锁都是根据执行的语句自动 ...

  6. (1.3)mysql 事务控制和锁定语句

    (1.3)mysql 事务控制和锁定语句 lock table 参考转载自:https://www.cnblogs.com/kerrycode/p/6991502.html 关键词:mysql loc ...

  7. mysql事务控制和锁定语句

    MySQL 支持对 MyISAM 和 MEMORY 存储引擎的表进行表级锁定,对 BDB 存储引擎的表进行页级锁定,对 InnoDB 存储引擎的表进行行级锁定.默认情况下,表锁和行锁都是自动获得的,不 ...

  8. django后台使用MySQL情况下的事务控制详解

    写在前面: 默认情况下django会把autocommit设置为“1”也就是说所针对数据库的每一次操作都会被做成“单独”的一个事务:这样的处理好处就在于它方便, 在编程的时候可以少写一些代码,比如我们 ...

  9. PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

    1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面 ...

随机推荐

  1. 基本语法 - PHP手册笔记

    PHP标记 如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记.这可以避免在PHP结束标记之后万一意外加入了空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出的意图.当然PH ...

  2. SQL Server 索引整理与堆重组。

    重新组织索引: alter index idx_OrderID      on dbo.OrderDetail      reorganize | reorganize;---可以rebuild 也可 ...

  3. mobile web曾经的踩过坑

    兼容性一直是前端工程师心中永远的痛.手机浏览器,因为基本是webkit(blink)内核当道,很多公司,不用考虑IE系的浏览器,所以感觉兼容性上的问题可能会少一些. 但是手机端,虽然出了很多工具,但是 ...

  4. Storm Esper

    https://github.com/hellojinjie https://github.com/tomdz/storm-esper https://github.com/jayway/awaiti ...

  5. HTTP based RESTful APIs - asp.net web api

    1.HTTP http://www.w3.org/Protocols/rfc2616/rfc2616.html 2.REST是什么http://www.ics.uci.edu/~fielding/pu ...

  6. 不是技术牛人,如何拿到国内IT巨头的Offer

    原地址:http://blog.csdn.net/lsldd/article/details/13506263 不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些 ...

  7. 获取windows身份认证网站页面内容

    有些网站必须登录才能获取到页面内容. 代码如下,可获取数据. var url = "https://yunda-api-test.appspot.com/int/parcel?wait=tr ...

  8. 全国计算机等级考试二级教程-C语言程序设计_第2章_C程序设计的初步知识

    正负号与被除数一致. 3 % (-5) == 3 (-3) % 5 == -3 不用求余运算符,求出余数. int x, y; 答:x - x / y * y; const int i = 10; c ...

  9. OC基础3:一些基本概念

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.关于NSLog函数中的“%2i”: ( ...

  10. HDU2842-Chinese Rings(递推+矩阵高速幂)

    pid=2842">题目链接 题意:求出最少步骤解出九连环. 取出第k个的条件是,k-2个已被取出,k-1个仍在支架上. 思路:想必九连环都玩过吧,事实上最少步骤就是从最后一个环開始. ...