我正在学习在MySQL中使用事务,但它似乎并不像它应该的那样工作。
我创建了一些测试代码:
$db->query('START TRANSACTION;');
$db->query('DELETE FROM test1 WHERE id=4');
$db->query('DELETE FROM ttest2 WHERE id=5');
$res = $db->commit();
其中"ttest2“是故意的错误(表格拼写错误)。
对于普通查询,$res将为false,并且查询将失败。但是当我运行事务时,第一个
我在这里有一个来自MySQL 5.5.20 (基于行的)的二进制日志转储。现在我的奴隶停止了,因为UPDATE事件在INSERT事件之前:
5424240-SET TIMESTAMP=1327402568/*!*/;
5424241-BEGIN
5424242-/*!*/;
5424243-# at 25715325
5424244-# at 25715417
5424245:#120124 11:56:08 server id 1 end_log_pos 25715417 Table_map: `auto`.`data_export` mapped to number 91425
我似乎有一个错误的想法:
update table_name set id=222 where id >333;
我的旧观点是,如果没有begin,commit就不会启动事务。但这似乎是错的。
但是当我阅读mysql 时,我发现似乎所有的sql都会在transaction.if中不显式地使用begin和commit,它将启动InnoDB中隐含的事务。
在InnoDB中,所有用户活动都发生在事务中。如果启用了自动提交模式,则每个SQL语句都会自行形成单个事务。默认情况下,MySQL为每个启用自动提交的新连接启动会话,因此如果该语句没有返回错误,则在每个SQL语句之后执行提交。如果语句返
表:
create table properties
(
id int auto_increment primary key,
other_id int null
);
create index index_properties_on_other_id
on properties (other_id);
TX 1:
start transaction;
SET @last_id = 1;
delete from `properties` WHERE `properties`.`other_id` = @last_id;
I
我的PHP/Mysql脚本分阶段工作:
Insert Customer info
Get new customer's ID via mysqli_insert_id(blah)
Insert into ADDRESS using new customer's ID
Insert into PHONE using new customer's ID
Insert into CONTACTS using new customer's ID
我的问题是:如果后一个insert语句出了问题,MYSQL当然会停止并抛出一个错误,但是初始的客户插入已经启动并成功了。现
我正在尝试制作一个实验性的web应用程序,它可以最小化冗余数据。我有三个示例表格,如下所示:
Table one
ID | created_at (unix timestamp) | updated_at (unix timestamp)
Table two
ID | Foreign Key to table one | Title
Table three (pages)
ID | Foreign Keys to both table one and two | Content | Metadata
这个想法是,在应用程序中创建的所有内容都将具有创建/编辑时间。
许多(但不是所有)事物都会
我有以下两个导致死锁的事务:
事务1:
SELECT *
FROM bots b
WHERE b.status = :available
AND (b.last_checked_at IS NULL OR b.last_checked_at < :fiveMinsAgo)
ORDER BY b.last_checked_at ASC
LIMIT 1
FOR UPDATE
*AND* (I don't think that this statement is part of the issue)
UPDATE bots b
SET b.last_checked_at = :no
在sql server 2008中,我使用的模式如下:
begin transaction
begin try
/* do something */
end try
begin catch
if @@TRANCOUNT > 0
rollback
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity
我的项目使用spring-data-mongodb,一切都是反应性的。有一个bean具有使用声明性事务的事务性方法。相关代码片段如下:
@Configuration
public class Config {
@Bean
public ReactiveMongoTransactionManager reactiveMongoTransactionManager() {
return new ReactiveMongoTransactionManager(reactiveMongoDbFactory());
}
...
}
@Service