Monday, September 11, 2023

WITH READPAST

Giriş
Açıklaması şöyle
READPAST skips through rows that are locked for update by other transactions but ONLY when the query you execute is about to get blocked on locked rows. So READPAST doesn’t skip locked rows on normal select queries because it can read from a snapshot (MVCC)
Örnek
Tabloda 1,2,3,4,5 satırları olsun. Şöyle yaparız
-- run transaction 1 and don’t commit;
BEGIN TRANSACTION;

UPDATE T SET F = 100 WHERE F = 1


-- in another transaction do
SELECT * FROM T WITH (READPAST)
Burada sonuç olarak 2,3,4,5 alırız. 1 numaralı satır atlandı

Şöyle yaparız
BEGIN TRANSACTION;
UPDATE T WITH (READPAST) SET F = 900 WHERE F < 10;
Burada 2,3,4,5 numaralı satırla güncellenir ama 1 numaralı satır atlanır.  Aynı şeyi şöyle de yapabiliriz
BEGIN TRANSACTION;

UPDATE T

SET F = 900 WHERE F IN( SELECT F FROM T WITH READPAST WHERE F < 10) 
Ama şöyle yapsaydık bloke olurdu. Çünkü WITH READPAST kullanılmadı
BEGIN TRANSACTION;

UPDATE T

SET F = 900 WHERE F < 10;

Monday, September 4, 2023

sa Kullanıcısı - Administrator

SQL Server kurulunca genellikle sa isimli bir administrator kullanıcı yaratılır

Tuesday, August 22, 2023

Sütun Tipleri - FLOAT

Giriş
SQL Server'da DOUBLE diye bir sütun tip yok. Onun yerine FLOAT var. Açıklaması şöyle
float (n) : The n parameter indicates whether the field should hold 4 or 8 bytes. float(24) holds a 4-byte field and float(53) holds an 8-byte field. Default value of n is 53.
Yani FLOAT(24), FLOAT(53) veya kısaca sadece FLOAT şeklinde kullanılabilir. 

Aslında bu isimlendirme bence yanlış ve karışıklığa sebep oluyor. Çünkü diğer programlama dillerinden FLOAT başka bir anlama geliyor.

Tuesday, August 8, 2023

Sütun Tipleri - DATETIME - Time Zone Bilmez

Giriş
Not: Bu sütun tipi yerine datetime2 kullanılması öneriliyor. datetime2 kesin milisaniye ve microsaniye saklayabiliyor

Açıklaması şöyle
The DATETIME data type specifies a date and time with fractional seconds.

DATETIME supports dates from January 1, 1753, through December 31, 9999.

The default value is 1900-01-01 00:00:00. The time is based on 24-hour clock.
Format şöyle
yyyy-MM-dd HH:mm:ss[.nnn]
nnn 0 to 999 arasında bir sayı olabilir. Yani milisaniyeyi temsil eder. Ancak milisaniye kısmı aslında yuvarlanır.  Açıklaması şöyle
datetime rounds fractional seconds to the nearest 0, 3, or 7 milliseconds.

Örnek
DATETIME tipini DATE tipine çevirmek için şöyle yaparız
SELECT *
FROM table1 a INNER JOIN table2 b
    ON a.id = b.a_id
    AND CONVERT(date, a.dt) = CONVERT(date, b.dt)

Thursday, June 22, 2023

Deadlock

Örnek
Şöyle yaparız
-- Transaction A
BEGIN;
UPDATE Orders SET Quantity = Quantity - 1 WHERE OrderID = 1;
-- Now Transaction A needs to update Customers
UPDATE Customers SET TotalOrders = TotalOrders + 1 WHERE CustomerID = 1;
COMMIT;

-- Transaction B
BEGIN;
UPDATE Customers SET TotalOrders = TotalOrders - 1 WHERE CustomerID = 1;
-- Now Transaction B needs to update Orders
UPDATE Orders SET Quantity = Quantity + 1 WHERE OrderID = 1;
COMMIT;
Açıklaması şöyle
In this example, if Transaction A and Transaction B are executed concurrently and the timing is such that Transaction A locks the Orders table and Transaction B locks the Customers table before either has a chance to commit, a deadlock will occur.

Monday, April 3, 2023

Sunday, April 2, 2023

TestContainers MSSQLServerContainer Sınıfı

Maven
Şöyle yaparız
<dependency>
  <groupId>org.testcontainers</groupId>
  <artifactId>mssqlserver</artifactId>
  <version>1.18.10</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>com.microsoft.sqlserver</groupId>
  <artifactId>mssql-jdbc</artifactId>
  <version>11.2.2.jre8</version>
  <scope>test</scope>
</dependency>
Örnek
Şöyle yaparız
@Container
private static final MSSQLServerContainer<?> SQLSERVER_CONTAINER =
 new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:2022-latest").acceptLicense();
acceptLicense metodu
Örnek
Şöyle yaparız
MSQLServerContainer mssqlserver = new MSSQLServerContainer<>(...).acceptLicense();
getDatabaseName metodu
UnsupportedOperationException fırlatıyor. Neden bilmiyorum

withDatabaseName metodu
UnsupportedOperationException fırlatıyor. Neden bilmiyorum
 
withUrlParam metodu
Örnek
Şöyle yaparız
MSSQLServerContainer<> container = 
  new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:2017-CU12");
container.withUrlParam("user", container.getUsername())
         .withUrlParam("password", container.getPassword());
container.start();
String jdbcUrl = container.getJdbcUrl();
withStartupCheckStrategy metodu
Örnek
Şöyle yaparız
new MSSQLServerContainer<>("mcr.microsoft.com/mssql/server:2017-latest")
  .withStartupCheckStrategy(
    new MinimumDurationRunningStartupCheckStrategy(Duration.ofSeconds(5)));




VSS vs. VDI Backup

Giriş İlk olarak burada gördüm 1.Volume Shadow Copy Service (VSS) Sanırım Windows diskin kopyasını alıyor 2. Virtual Device Interface (VDI)...