当我运行多个查询时,事务是否会锁定我的表?
例如:如果另一个用户在同一时间尝试发送数据,而我正在使用事务,会发生什么?
还有,我如何避免这种情况,但同时确保所有数据已成功插入数据库?
Begin Tran;
Insert into Customers (name) values(name1);
Update CustomerTrans
set CustomerName = (name2);
Commit;
当我运行多个查询时,事务是否会锁定我的表?
例如:如果另一个用户在同一时间尝试发送数据,而我正在使用事务,会发生什么?
还有,我如何避免这种情况,但同时确保所有数据已成功插入数据库?
Begin Tran;
Insert into Customers (name) values(name1);
Update CustomerTrans
set CustomerName = (name2);
Commit;
你需要聪明地实现事务。以下是一些与性能相关的要点:
这些是你可以做的几点。
你无法避免多个用户向数据库加载数据。每次单个用户请求使用表时锁定并不可行也不聪明。实际上,你不必担心这个问题,因为数据库本身会提供机制来避免这种问题。我建议你了解ACID属性。
可能发生的是,你可能会遭受幽灵读取,基本上是指除非插入数据的用户提交,否则你无法读取数据。即使你已经完成插入数据但没有提交,也有很大的机会看不到更改。
DDL操作(如创建、删除等)本身在最后提交。然而,DML操作(如更新、插入、删除等)在最后不会提交。
UPDATE
语句中没有WHERE
子句,因此表中的每一行都将被更新并锁定,直到事务提交。但是,如果您有一个WHERE
子句和有用的索引,那么只有这些行会被锁定。 - Dan Guzman